Object.defineProperty基本用法

看風景就發表於2018-09-17

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

相關文章