有兩種不同類型的屬性:數(shù)據(jù)屬性和訪問器屬性。
數(shù)據(jù)屬性包含一個值,如book1的name屬性。
訪問器屬性不包含值。
訪問器屬性只需要一個getter或setter。
有一種特殊的語法來使用對象字面量來定義訪問器屬性:
var book1 = {
_name : "Javascript",
/* o2fo.com*/
get name() {
console.log("Reading name");
return this._name;
},
set name(value) {
console.log("Setting name to %s", value);
this._name = value;
}
};
console.log(book1.name);
book1.name = "CSS";
console.log(book1.name);
上面的代碼生成以下結(jié)果。
在訪問器屬性名稱之前使用特殊關(guān)鍵字 get
和 set
。
在數(shù)據(jù)和訪問器之間共享兩個屬性屬性屬性。
一個是[[Enumerable]],它決定是否可以迭代。
另一個是[[Configurable]],它確定屬性是否可以更改。
我們可以使用 delete
刪除可配置屬性并可以隨時更改其屬性。
默認(rèn)情況下,我們在對象上聲明的所有屬性都是可枚舉和可配置的。
我們可以使用 defineProperty
方法來更改 [[Enumerable]]
和 [[Configurable]]
。
var book1 = {
name : "Javascript"
};
Object.defineProperty(book1, "name", {
enumerable : false
});
console.log("name" in book1); // true
console.log(book1.propertyIsEnumerable("name")); // false
var properties = Object.keys(book1);
console.log(properties.length); // 0
Object.defineProperty(book1, "name", {
configurable : false
});
// try to delete the Property
delete book1.name;
console.log("name" in book1); // true
console.log(book1.name); // "Javascript"
//Object.defineProperty(book1, "name", { // error!!!
// configurable : true
//});
上面的代碼生成以下結(jié)果。
當(dāng)JavaScript以嚴(yán)格模式運(yùn)行時,嘗試刪除不可配置的屬性導(dǎo)致錯誤。
在非嚴(yán)格模式下,操作會靜默失敗。
更多建議: