1. 基本形式
Object.defineProperty(obj,prop,descriptor)
参数说明:
obj: 必需,目标对象
prop: 必需,需定义或修改属性的名字
descriptor: 必需,目标属性所拥有的特性
2. descriptor的基本机构
{ value: 任意类型的值, configurable: true | false, //属性是否可以被delete,或者再次修改descriptor enumerable: true | false, //属性是否可以被for...in,Object.keys()枚举 writable: true | false, //对象是否可被赋值 get:function(){} | undefined, set:function(){} | undefined }
get,set方法不能与writable或value一起使用
3. configurable详细说明
是否可以删除目标属性或是否可以再次修改属性的特性(writable, configurable, enumerable)。设置为true可以被删除或可以重新设置特性;设置为false,不能被可以被删除或不可以重新设置特性。默认为false。
这个属性起到两个作用:
目标属性是否可以使用delete删除
目标属性是否可以再次设置特性
例如:
//-----------------测试目标属性是否能被删除------------------------ var obj = {} //第一种情况:configurable设置为false,不能被删除。 Object.defineProperty(obj,"newKey",{ value:"hello", writable:false, enumerable:false, configurable:false }); //删除属性 delete obj.newKey; console.log( obj.newKey ); //hello //第二种情况:configurable设置为true,可以被删除。 Object.defineProperty(obj,"newKey",{ value:"hello", writable:false, enumerable:false, configurable:true }); //删除属性 delete obj.newKey; console.log( obj.newKey ); //undefined //-----------------测试是否可以再次修改特性------------------------ var obj = {} //第一种情况:configurable设置为false,不能再次修改特性。 Object.defineProperty(obj,"newKey",{ value:"hello", writable:false, enumerable:false, configurable:false }); //重新修改特性 Object.defineProperty(obj,"newKey",{ value:"hello", writable:true, enumerable:true, configurable:true }); console.log( obj.newKey ); //报错:Uncaught TypeError: Cannot redefine property: newKey //第二种情况:configurable设置为true,可以再次修改特性。 Object.defineProperty(obj,"newKey",{ value:"hello", writable:false, enumerable:false, configurable:true }); //重新修改特性 Object.defineProperty(obj,"newKey",{ value:"hello", writable:true, enumerable:true, configurable:true }); console.log( obj.newKey ); //hello
4. 对象已有的属性可以修改descriptor,设置其为不可写或不可枚举
5. 使用Object.defineProperty添加属性,若不设置descriptor,则会采用默认值,configurable,enumerable,writable均为false
参考:https://segmentfault.com/a/1190000007434923