Object 的静态方法
再提一下什么是静态方法:
静态方法:在类身上的方法,
动态方法:在实例身上的方法
对 对象的属性 进行 防篡改处理
Object.defineProperties(obj, props)以及数据劫持效果
obj:被添加属性的对象
props:添加或更新的属性对象
给对象定义属性,
如果存在该属性,则用新定义的属性更新已存在的属性,
如果不存在该属性,则添加该属性。
如果是新添加的属性,一定要设置是否可枚举,不然为false
enumerable(是否可枚举):默认为false
writable(是否可写):默认为false
configurable:是否可删除delete
Object.defineProperty()
在对象上定义新属性,或修改对象现有属性,并返回该对象。
Object.defineProperty(obj, 属性名字, {设置属性})
例子1:防篡改处理
let obj = {
name: 'xx',
num: 0
};
Object.defineProperties(obj, {
name:{
value: 'yy', // 表示该属性(这里是name)的属性值,默认为undefined
writable: false, // 是否可重新赋值,默认为 true
enumerable: false, // 是否可遍历(枚举,通过for-in循环返回属性),默认为true
configurable: false // 是否可删除(通过delete删除属性从而重新定义属性),默认为true
},
age:{
value: 20,
enumerable: true
}
});
obj.age = 30;
console.log(obj.age); // 默认不可写,所以此处依然是 20
delete obj.name; // 此处删了一个不可删除的属性
console.log(obj.name); // 当然能显示 yy
例子2:数据劫持 效果
let obj = {
num:4
};
let n = 2;
Object.defineProperty(obj,'num',{
get:function(){ // 取 obj.num 属性时会触发 get 方法
/*数据劫持*/
// 当你获取这个属性的时候,会调用
n += 2;
return n;
},
set(val){ // 给 obj.num 赋值时会触发 set 方法
// val 是给 obj.num 赋值时的那个值
}
});
console.log(obj.num < 5 && obj.num > 5);//true
/*
num即小于5,又大于,就是应为,第一次判断obj.num时num=(n+=2)=4,符合了第一个条件,此时的n=4。
读到第二个判断的时候,再次触发函数,此时n+=之后为6,又符合了第二个判断条件,所以出现了true
*/
对 对象自身进行 防 篡改处理
不可扩展对象
var person = { name: "Nicholas" };
Object.preventExtensions(person);
person.age = 29;
alert(person.age); // undefined
// 严格模式下,进行添加或者删除属性都会报错。非严格模式下,直接忽略。
使用Object.isExtensible()
方法可以确认对象是否可扩展
var person = { name: "Nicholas" };
alert(Object.isExtensible(person)); // true
Object.preventExtensions(person);
alert(Object.isExtensible(person)); // false
密封的对象(不可扩展也不可删除)
var person = { name: "Nicholas" };
Object.seal(person);
person.age = 29;
alert(person.age); // undefined
delete person.name;
alert(person.name) // "Nicholas"
// 严格模式下,进行添加或者删除属性都会报错。非严格模式下,直接忽略。
使用Object.isSealed()
来确定对象是否被密封了,密封的对象同时不可扩展
var person = { name: "Nicholas" };
alert(Object.isExtensible(person)); // true
alert(Object.isSealed(person)); // false
Object.seal(person);
alert(Object.isExtensible(person)); // false
alert(Object.isSealed(person)); // true
冻结的对象(不可扩展、不可删除、不可修改)
var person = { name: "Nicholas" };
Object.freeze(person);
person.age = 29;
alert(person.age); // undefined
delete person.name;
alert(person.name) // "Nicholas"
person.name = "Greg";
alert(person.name) // "Nicholas"
// 严格模式下,进行添加、删除、修改属性都会报错。非严格模式下,直接忽略。
使用Object.isFrozen()
来确定对象是否被冻结了,冻结的对象同时不可扩展、不可删除
var person = { name: "Nicholas" };
alert(Object.isExtensible(person)); // true
alert(Object.isSealed(person)); // false
alert(Object.isFrozen(person)); // false
Object.seal(person);
alert(Object.isExtensible(person)); // false
alert(Object.isSealed(person)); // true
alert(Object.isFrozen(person)); // true