屬性類型
- 資料屬性
- [configurable]:表示能否通過delete删除屬性進而重新定義屬性,能否修改屬性的特性,或者能否把屬性修改為通路器屬性。預設值為true
- [Enumerable]:表示能否通過for-in循環傳回屬性。預設值為true
- [Writable]:表示能否修改屬性的值。預設值為true
- [Value]:包含這個屬性的值。預設值為undefined
- –>要修改屬性預設的特性,必須使用ECMAScript5的object.defineProoerty()方法。這個方法接收三個參數:屬性所在的對象、屬性的名字和一個描述符對象。其中描述符(descriptor)對象的屬性必須是:configurable,enumerable,writable和value。`代碼如下
var person = {};
Object.defineProperty(person, "name", {
writable: false,
value: "Nicholas"
});
alert(person.name);
person.name = "Michael";
alert(person.name);
- 通路器屬性
- 通路器屬性不包含資料值,它們包含以對getter和setter函數。在讀取通路器屬性時,會調用getter函數,這個函數負責傳回有效地值;在寫入通路器屬性時,會調用setter函數并傳入新值,這個函數負責決定如何處理資料。通路器屬性有4個特性。
- [configurable]:表示能否通過delete删除屬性進而重新定義屬性,能否修改屬性的特性,或者能否把屬性修改為通路器屬性。預設值為true
- [Enumerable]:表示能否通過for-in循環傳回屬性。預設值為true
- [get]:在讀取屬性時調用的函數。預設值為undefined
- [set]:在讀入屬性時調用的函數。預設值為undefined
- 通路器屬性不能直接定義,必須使用object.defneProperty()來定義。代碼如下
var book = {
_year: ,
edition:
};
Object.defineProperty(book, "year", {
get: function(){
return this._year;
},
set: function(newValue){
if (newValue > ) {
this._year = newValue;
this.edition += newValue - ;
}
}
});
book.year = ;
alert(book.edition); //2
- 讀取屬性特征
- object.getOwnPropertyDescriptor()方法可以取得給定屬性的描述符。這個方法接受兩個參數L屬性所在的對象和要讀取器描述符的屬性名稱。傳回值是一個對象,如果是通路器屬性,這個對象屬性有configurable,enumerable,get,set;如果是資料屬性,這個對象的屬性有configurable,enumerable,writable,value。代碼如下
var book = {};
Object.defineProperties(book, {
_year: {
value:
},
edition: {
value:
},
year: {
get: function(){
return this._year;
},
set: function(newValue){
if (newValue > ) {
this._year = newValue;
this.edition += newValue - ;
}
}
}
});
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"
`