描述
該方法允許精確添加或修改對(duì)象的屬性。通過賦值操作添加的普通屬性是可枚舉的,能夠在屬性枚舉期間呈現(xiàn)出來(for...in 或 Object.keys 方法), 這些屬性的值可以被改變,也可以被刪除。這個(gè)方法允許修改默認(rèn)的額外選項(xiàng)(或配置)。默認(rèn)情況下,使用 Object.defineProperty() 添加的屬性值是不可修改的。
語法
Object.defineProperty( obj, prop, desc );
參數(shù)
- obj : 要在其上定義屬性的對(duì)象
- prop : 要定義或者修改的屬性名稱(String)
- desc : 要定義或者修改的屬性描述符
返回值
被傳遞給函數(shù)的對(duì)象
屬性描述符
屬性描述符分為 數(shù)據(jù)描述符 和 存取描述符
它們均有以下兩個(gè)可選的鍵值
- configurable : 當(dāng)且僅當(dāng)該屬性的 configurable 為 true 時(shí),該屬性描述符才能夠被改變,同時(shí)該屬性也能從對(duì)應(yīng)的對(duì)象上被刪除。默認(rèn)為 false。
- enumerable : 當(dāng)且僅當(dāng)該屬性的enumerable為true時(shí),該屬性才能夠出現(xiàn)在對(duì)象的枚舉屬性中。默認(rèn)為 false。
數(shù)據(jù)修飾符具有以下兩個(gè)可選鍵值
- value : 該屬性對(duì)應(yīng)的值??梢允侨魏斡行У?JavaScript 值(數(shù)值,對(duì)象,函數(shù)等)。默認(rèn)為 undefined。
- writable : 當(dāng)且僅當(dāng)該屬性的writable為true時(shí),value才能被賦值運(yùn)算符改變。默認(rèn)為 false。
存取修飾符具有以下兩個(gè)可選鍵值
- get : 一個(gè)給屬性提供 getter 的方法,如果沒有 getter 則為 undefined。當(dāng)訪問該屬性時(shí),該方法會(huì)被執(zhí)行,方法執(zhí)行時(shí)沒有參數(shù)傳入,但是會(huì)傳入this對(duì)象(由于繼承關(guān)系,這里的this并不一定是定義該屬性的對(duì)象)。
默認(rèn)為 undefined。- set : 一個(gè)給屬性提供 setter 的方法,如果沒有 setter 則為 undefined。當(dāng)屬性值修改時(shí),觸發(fā)執(zhí)行該方法。該方法將接受唯一參數(shù),即該屬性新的參數(shù)值。
默認(rèn)為 undefined。
demo
var o = {}; // 創(chuàng)建一個(gè)新對(duì)象
// 在對(duì)象中添加一個(gè)屬性與數(shù)據(jù)描述符的示例
Object.defineProperty(o, "a", {
value : 37,
writable : true,
enumerable : true,
configurable : true
});
// 對(duì)象o擁有了屬性a,值為37
// 在對(duì)象中添加一個(gè)屬性與存取描述符的示例
var bValue;
Object.defineProperty(o, "b", {
get : function(){
return bValue;
},
set : function(newValue){
bValue = newValue;
},
enumerable : true,
configurable : true
});
o.b = 38;
// 對(duì)象o擁有了屬性b,值為38
// o.b的值現(xiàn)在總是與bValue相同,除非重新定義o.b
// 數(shù)據(jù)描述符和存取描述符不能混合使用
Object.defineProperty(o, "conflict", {
value: 0x9f91102,
get: function() {
return 0xdeadbeef;
}
});
// throws a TypeError: value appears only in data descriptors, get appears only in accessor descriptors