1. 程式人生 > >關於訪問器屬性

關於訪問器屬性

ron edi ret bject tro get obj 負責 bsp

要修改屬性默認的特性,必須使用ECAMScript 5的 Object.defineProperty() 方法。
例如:

var person = {};
Object.defineProperty(
person,‘name‘,{
writable:false,
value:‘tom‘
}
);
console.log(person.name);//tom
person.name = ‘join‘;
console.log(person.name);//tom

這個例子創建了一個名為name的屬性,他的值為tom是只讀的。這個屬性的值是不可以修改的,如果嘗試為他指定新值,在非嚴格模式下,賦值操作將被忽略,在嚴格模式下,賦值操作將會導致拋出錯誤。
類似的規則也適用於不可配置的屬性。例如:

var person = {};
Object.defineRroperty(person,‘name‘,{
configurable:false,
value:‘tom‘
});
console.log(perso.name);//tom
delete person.name;//false
console.log(person.name);//tom

可以多次調用Object.defineProperty()方法修改同一個屬性,但是把configurable特性設置為false之後就會有限制

調用這個方法的時候,如果不指定,configurable、enumerable 和writable特性的默認值都是false

訪問器屬性
訪問器屬性不包含數據值
他們包含一對getter和setter函數(不過,這兩個函數都不是必須的)
在讀取訪問器屬性的時候,會調用getter函數,這個函數復制返回有效的值。
在寫入訪問器屬性的時候,會調用setter函數,並傳入新值,這個函數負責決定如何處理數據。
訪問器屬性有如下四個特性
configurable
表示能否通過delete刪除屬性從而重新定義屬性,能否修改屬性的特性,或者能否把屬性修改為數據屬性。
直接在對象時定義的屬性,這個特性的默認值為true
enumerable
保濕能否通過for-in循環返回屬性。
直接在對象上定義的屬性,這個特性的默認值為true
get
在讀取屬性時調用的函數
默認值為undefined
set


在寫入屬性時調用的函數
默認值為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;
console.log(book.edition);// 2

關於訪問器屬性