preventExtensions
默认情况下,所有对象都是可扩展的。在调用preventExtensions
之后,将不能再往对象中添加属性(严格模式报错,非严格模式静默失败),对已有属性没有影响
- let obj1 = {name: 'xiaohua'};
- Object.preventExtensions(obj1);
- obj1.name = 'xiaomei';
- obj1.name //xiaomei 已有属性可读可写
- obj1.age=23
- obj1.age // undefined,添加属性静默失败
- 复制代码
seal
密封属性;密封属性不可扩展;而且已有成员的configurable属性会被设置为false
- let obj2 = {name: 'xiaohua'};
- Object.seal(obj2);
- Object.isExtensible(obj2) // false, 不可扩展
- obj1.age=23
- obj1.age // undefined,添加属性静默失败
- Object.getOwnPropertyDescriptor(obj2, 'name') // writable: true, enumerable: true, configurable: false
- 复制代码
freeze
冻结对象;冻结对象不可扩展且密封;而且已有成员的configurable及writable属性会被设置为false
- let obj3 = {name: 'xiaohua'};
- Object.freeze(obj3)
- Object.isExtensible(obj3) // false, 不可扩展
- Object.isSealed(obj3) // true, 密封
- Object.getOwnPropertyDescriptor(obj2, 'name') // writable: false, enumerable: true, configurable: false
- 复制代码
补充知识
两种定义对象属性的方式比较
使用obj = {age: 2}
定义对象的属性,其writable,enumerable,configurable均为true
- let obj = {age: 2};
- Object.getOwnPropertyDescriptor(obj, 'age');
- // value: 2, writable: true, enumerable: true, configurable: true
- 复制代码
Object.defineProperty(obj, prop, descriptor),使用defineProperty
定义对象的属性,其中未定义的属性默认为false
- let obj2 = {};
- Object.defineProperty(obj2, 'age', {value: 2});
- Object.getOwnPropertyDescriptor(obj2, 'age');
- // value: 2, writable: false, enumerable: false, configurable: false
- Object.defineProperty(obj2, 'favourites', {value: 'js', writable: true});
- Object.getOwnPropertyDescriptor(obj2, 'favourites');
- // value: "js", writable: true, enumerable: false, configurable: false
- 复制代码
writable,enumerable,configurable
对象的数据属性
writable:表示能否修改属性的值。true时,可以重写该属性的值;属性为false时,修改属性的值在非严格模式下不会生效,严格模式下会报错。
enumerable:表示能否通过for-in
或Object.keys()
循环返回属性。true时可以访问,false不可以访问到
configurable:表示能否通过delete删除属性,能否通过Object.defineProperty()修改属性的特性。值为true时可以delete并且可以修改,值为false时,表示不能从对象中删除属性。如果对这个属性调用delete,则在非严格模式下什么也不会,但是严格模式下会导致错误。而且,此时,再调用Object.defineProperty()方法修改除writable之外的特性,都会导致错误。
- let person = {};
- Object.defineProperty(person, 'name', {value: 'xiaohua', writable: true, enumerable: true});
- // writable: true, enumerable: true, configurable: false
- Object.defineProperty(person, 'name', { enumerable: false}); // 报错
- Object.defineProperty(person, 'name', { writable: false}); // configurable为false, 且writable为true时,可以修改writable
- // writable: false, enumerable: true, configurable: false
- Object.defineProperty(person, 'name', { writable: true}); // 报错
- 复制代码
value:表示这个属性的数据值,默认为undefined
在调用Object.defineProperty()方法时,以上属性默认 false
访问器属性
访问器属性不包含数据值-它们是一对getter和setter函数。访问器属性有如下4个特性
configurable: 同上
enumerable: 同上
get:在读取属性时调用的函数
set:在写入属性时调用的函数