JS的属性描述符
默认创建对象时属性为数据属性
数据属性
字面量创建属性时默认为
1 | { |
Object.defineProperty方法创建属性时默认为
1 | { |
可以使用Object.getOwnPropertyDescriptor或Object.getOwnPropertyDescriptors方法来获取对象属性的描述符信息;
configurable为false,writable为true时,可通过赋值的方式或者Object.defineProperty的方式修改value值;configurable为false,writable为false时,只能通过Object.defineProperty的方式修改value值;configurable为false,writable为true时,可将wirtable设置为false;configurable为false,writable为false时,无法修改wirtable的值;configurable为false后,也无法修改为true;
访问器属性
字面量创建访问器属性为
1 | const obj={ |
Object.defineProperty方法创建访问器属性
1 | const obj={} |
默认值为
1 | { |
方法
为目标对象设置单个属性
设置单个属性可以使用Object.defineProperty()方法,要注意的是,对于同一个属性,不可以同时在描述符中指定属于数据描述符的value,writable和属于访问器描述符的get,set,否则会报错。为目标对象设置多个属性
设置多个属性可以使用Object.defineProperties()方法。禁止目标对象扩展(不允许添加新属性
禁止添加新属性可以使用Object.preventExtensions()方法,该方法接收一个目标对象传入,使用后该对象禁止添加新属性。使该对象禁止扩展。密封目标对象(不允许扩展且不允许进行属性配置)
我们可以使用Object.seal()方法创建一个“密封”的对象,这个方法实际上会在一个现有对象上调用 Object.preventExtensions()方法 并把所有现有属性标记为configurable:false。密封之后不仅不能添加新属性,也不能重新配置或者删除任何现有属性(但是可以修改属性的值)冻结目标对象(密封对象且不允许修改)
Object.freeze(..)会创建一个冻结对象,这个方法实际上会在一个现有对象上调用Object.seal(..)并把所有“数据访问”属性标记为 writable:false,这样就无法修改它们的值。