對象的屬性類型
-----數(shù)據(jù)屬性
數(shù)據(jù)屬性包含一個數(shù)據(jù)值的位置送淆,這個位置上可以讀取和寫入,數(shù)據(jù)屬性有4個描述其行為的特性 晨横;
[[Configurable]] :表示能否通過delete刪除屬性從而重新定義屬性啡直;能否修改屬性的特性或者能否把屬性修改成訪問器屬性;如果我們直接在對象上定義屬性如person.name = '小明'則這個數(shù)據(jù)屬性默認的[[Configurable]] 為true
[[Enumerable]] : 能否通過for-in循環(huán)镀脂;
[[Writable]] : 表示能否修改屬性的值牺蹄;
[[Value]] : 包含這個屬性的數(shù)據(jù)值,讀取屬性的值從這個位置讀取薄翅,寫入屬性的值也是保存在這個位置沙兰;
類向下面一樣定義個對象他的屬性name的 [[Configurable]],[[Enumerable]]翘魄, [[Writable]]都為true鼎天,[[Value]]則為定義的值‘'小明'對這個值得修改都反映在這個位置上
var person = {
name: "小明"
};
Object.defineProperty()可以修改屬性的默認特性;
接受三個參數(shù):
- 屬性所在對象
- 屬性名稱
- 描述對象暑竟;這個對象的屬性關(guān)鍵字必須是 Configurable训措,Enumerable, Writable光羞,Value中一個
var person = {};
Object.defineProperty(person, "name", {
writable: false,
value: "Nicholas"
});
alert(person.name); //"Nicholas"
person.name = "Greg"; // 由于writable:設(shè)置為false嚴格模式下這個操作會拋出錯誤
alert(person.name); //"Nicholas"
注意:當用Object.defineProperty()吧Configurable設(shè)置為false(不可配置)這不能在設(shè)置回true(可配置);再次調(diào)用Object.defineProperty()修改除writable意外的特性都會報錯
-----訪問器屬性
訪問器屬性不包含數(shù)據(jù)值但是包含一對getter 和setter函數(shù)(這兩個函數(shù)都不是必須的 )怀大;訪問器屬性有如下四個特性纱兑;
[[Configurable]] :表示能否通過delete刪除屬性從而重新定義屬性;能否修改屬性的特性或者能否把屬性修改成訪問器屬性化借;如果我們直接在對象上定義屬性如person.name = '小明'則這個數(shù)據(jù)屬性默認的[[Configurable]] 為true
[[Enumerable]] : 能否通過for-in循環(huán)潜慎;
[[Get]] : 在讀取屬性的時候調(diào)用,默認值為undefined蓖康;
[[Set]] : 在寫入屬性的時候調(diào)用铐炫,默認值為undefined;
通過Object.defineProperty()可以修改屬性的默認特性蒜焊;
var book = {
_year: 2004,
edition: 1
};
Object.defineProperty(book, "year", {
get: function(){
return this._year;
},
set: function(newValue){
if (newValue > 2004) {
this._year = newValue;
this.edition += newValue - 2004;
}
}
});
book.year = 2005;
alert(book.edition); //2
Object.defineProperties()定義多個屬性的特性
var book = {};
Object.defineProperties(book, {
_year: {
value: 2004
},
edition: {
value: 1
},
year: {
get: function(){
//代碼...
},
set: function(newValue){
// 代碼...
}
}
})
Object.getOwnPropertyDescriptor()讀取屬性的特性
var book = {};
Object.defineProperties(book, {
_year: {
value: 2004
},
edition: {
value: 1
},
year: {
get: function(){
return this._year;
},
set: function(newValue){
if (newValue > 2004) {
this._year = newValue;
this.edition += newValue - 2004;
}
}
}
});
var descriptor = Object.getOwnPropertyDescriptor(book, "_year");
alert(descriptor.value); //2004
alert(descriptor.configurable); //false
alert(typeof descriptor.get); //"undefined"
var descriptor = Object.getOwnPropertyDescriptor(book, "year");
alert(descriptor.value); //undefined
alert(descriptor.enumerable); //false
alert(typeof descriptor.get); //"function"