面向對象:屬性

屬性類型

數據屬性

[[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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章