訪問器屬性有兩個附加屬性。
因為沒有為存取器屬性存儲值,所以不需要[[Value]]或[[Writable]]。
相反,訪問器有[[Get]]和[[Set]],它們分別包含getter和setter函數(shù)。
我們只需要定義這些屬性之一來創(chuàng)建屬性。如果我們只定義[[Get]]屬性是可讀的,或者我們可以使用[[Set]]來設(shè)置屬性可寫。
如果您嘗試創(chuàng)建具有數(shù)據(jù)和訪問器屬性的屬性,您將獲得一個錯誤。
通過使用訪問器屬性屬性而不是對象我們可以定義的文字符號現(xiàn)有對象上的那些屬性。
要使用對象字面符號,我們必須在創(chuàng)建對象時定義訪問器屬性。
我們可以指定訪問器屬性是可配置還是可枚舉。
下面的代碼
var book1 = {
_name : "Javascript",
/*from w w w.j a va 2 s .c om*/
get name() {
console.log("Reading name");
return this._name;
},
set name(value) {
console.log("Setting name to %s", value);
this._name = value;
}
};
可以寫成:
var book1 = {
_name : "Javascript"
}; /*from w w w .j a va 2 s . c o m*/
Object.defineProperty(book1, "name", {
get : function() {
console.log("Reading name");
return this._name;
},
set : function(value) {
console.log("Setting name to %s", value);
this._name = value;
},
enumerable : true,
configurable : true
});
設(shè)置其他屬性([[Ienumerable]]和[[Configurable]])允許您可以更改評估者屬性的工作原理。
我們可以創(chuàng)建一個不可配置,不可數(shù),不可寫的屬性,如下所示:
var book1 = {
_name : "Javascript"
}; /*w w w . ja v a 2s. co m*/
Object.defineProperty(book1, "name", {
get : function() {
console.log("Reading name");
return this._name;
}
});
console.log("name" in book1); // true
console.log(book1.propertyIsEnumerable("name")); // false
delete book1.name;
console.log("name" in book1); // true
book1.name = "CSS";
console.log(book1.name); // "Javascript"
上面的代碼生成以下結(jié)果。
更多建議: