JavaScript 属性描述符
ES5开始,对象属性都具备了属性描述符,writable(可写)、enumerable(可枚举)、configurable(可配置)
var obj={ a:1 } Object.getOwnPropertyDescriptor(obj,'a');返回如下:
var obj2={}; Object.defineProperty(obj2,"a",{ value:3, writable:true, configurable:true, enumerable:true }); obj2.a;//输出3
使用Object.defineProperty(..) 可以添加一个新属性或者修改一个已有属性(如果属性可配置),并对特性进行设置。
注意:
1、把configurable修改为false是单向操作,无法撤销。
2、当configurable:false时,无法删除属性,delete obj.a; 静默失败
3、当configurable:false时,可以把writable的状态由true改为false,但无法由false改为true
设置writable:false和configurable:false就可以创建一个真正的常量属性。(不可以修改,重定义及删除)
禁止扩展:
var obj3={ a:1 }; Object.preventExtensions(obj3); obj3.b=2; obj3.b;//输出undefined使用Object.preventExtensions(..)禁止对象添加新属性,非严格模式下创建属性b静默失败,严格模式下,抛出TypeError错误。
密封:
Object.seal(..)创建一个"密封"的对象,实际上是在现有对象上调用了Object.preventExtensions,并把所有对象属性标记为configurable:false冻结:
Object.freeze(..) 创建一个冻结对象,实际上是在现有对象上调用了Object.seal,并把所有对象属性标记为writable:false