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