屬性類型
數據屬性
[[Configurable]]:能否通過delete刪除屬性而重新定義屬性,或能否把屬性修改爲訪問器屬性。默認爲:true。
[[Enumerable]]:能否通過for-in循環返回屬性。默認爲:true。
[[Writable]]:能否修改屬性的值。默認爲:true。
[[value]]:包含這個屬性的數據值。讀取屬性值時從這個位置讀;寫入時,把新值從這個地方保存。這個特性默認:undefind;
訪問器屬性
getter
讀取訪問器屬性時,調用getter,負責返回有效的值。
setter
寫入訪問器屬性時,調用setter傳入新值,負責如何處理數據
有四個特性
[[Configurable]]:能否通過delete刪除屬性而重新定義屬性,或能否把屬性修改爲訪問器屬性。默認爲:true。
[[Enumerable]]:能否通過for-in循環返回屬性。默認爲:true。
[[Get]]:在讀取屬性時調用的函數。默認:undefined;
[[Set]]:寫入屬性時調用的函數。默認:undefined;
var book={
_year:3002,
edition:1
};
Object.defineProperty(book,"year",{
get:function(){
return this._year;
},
set:function(newValue){
if(newValue>3002){
this._year=newValue;
this.edition+=newValue-3002
}
}
});
book.year=3004;
console.log(book.edition);//3
_year 前的下劃線是一種常用的記號,表明只能通過對象方法訪問的屬性。
方法
Object.defineProperty(屬性所在的對象,屬性的名字,一個描述符對象)
(描述符對象是上面四個其中一個)
var person={};
Object.defineProperty(person,"name",{
writable:false,
value:"xiaoming"
});
console.log(person.name);//xiaoming
person.name="xiaohong";
console.log(person.name);//xiaoming 嚴格模式下賦值操作會報錯
Object.defineProperties()
var book={};
Object.defineProperties(book,{
_year:{
writable:true,
value:2004
},
edition:{
writable:true,
value:1
},
year:{
get:function(){return this._year;},
set:function(newValue){
if(newValue>2004){
this._year=newValue;
this.edition+=newValue-2004
}
}
}
});
book.year=2005;
console.log(book.edition);//2
調用方法創建新屬性的時候,如果不指定,前三個屬性都是false。如果只是調用方法修改已經定義的屬性,則無限制。
Object.getOwnPropertyDescriptor(對象,讀取其描述符的屬性名稱);
訪問器屬性:參考訪問器屬性
數據屬性:參考前數據屬性。
var book={};
Object.defineProperties(book,{
_year:{//數據屬性
writable:true,
value:2004
},
edition:{
writable:true,
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");
console.log(descriptor.value);//2004
console.log(descriptor.configurable);//false
console.log(typeof descriptor.get)//undefined
var descriptor=Object.getOwnPropertyDescriptor(book,"year");
console.log(descriptor.value);//undefined
console.log(typeof descriptor.get);//function