一、理解對象
(一)屬性類型
- ECMA-262定義這些特性是爲了實現JavaScript引擎用的,因此在JavaScript中不能直接訪問它們。
1. 數據類型
- 數據屬性包含一個數據值的位置。在這個位置可以讀取和寫入值。
- ==【Configgurable】:表示能否通過delete刪除屬性從而重新定義屬性。==能否修改屬性的特性,或者能否把屬性修改爲訪問器屬性。默認值爲true。
- ==【Enumerable】:表示能否通過for-in循環返回屬性。==默認值爲true。
- ==【Writable】:表示能否修改屬性的值。==默認值爲true。
- ==【Value】:包含這個屬性的數據值。==默認值爲undefined。
value特性被設置指定的值:
var person = {
name:"Nicholas"
}
要修改屬性默認的特性,使用Object.defineProperty()方法。其接收三個參數:屬性所在的對象、屬性的名字和一個描述對象。描述符對象的屬性必須是configgurable、emnurable、writable和value。設置其中一或多個值,可以修改對應的特性值。
var person.defineProperty{person,"name",{
writable:false,
value:"Nicholas"
});
alert(person.name);//"Nicholas"
person.name = "Greg";
alert(person.name);//"Nicholas"
}
上面的例子創建了一個名爲name的屬性,它的值"Nicholas"是隻讀的,這個屬性的值是不可修改的,如果嘗試爲它指定新值,則在非嚴格模式下,賦值操作將被忽略。
2. 訪問器屬性
- 訪問器屬性不包含數據值。在讀取訪問器屬性時,會調用getter函數,這個函數負者返回有效的值;在寫入訪問器屬性時會調用setter函數並傳入新值,這個函數負者決定如何處理數據。
- 【Configurable】:表示能否通過delete刪除屬性從而重新定義屬性,能否修改屬性的特性,或者能否把屬性修改爲數據屬性。
- 【Enumerable】:表示能否通過for-in循環返回屬性。
- 【Get】:在讀取屬性時調用的函數,默認值爲undefined。
- 【】在寫入屬性時調用的函數,默認值爲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
- _year前面的下劃線是一種常用的記號,用於表示只能通過對象方法訪問的屬性。而訪問器屬性year則包含一個getter函數和一個setter函數 。setter函數返回_year的值,setter函數通過計算來確定正確的版本。
- 把year屬性修改爲2005會導致_year變成2005,而edition變爲2.這是使用訪問器屬性的常見方法,即設置一個屬性的值會導致其他屬性發生變化。
3. 定義多個屬性
- Object.defineProperty()方法可以通過描述符一次定義多個屬性。
- 第一個對象是要添加和修改其屬性的對象,第二個對象的屬性與第一個對象中要添加或修改的屬性一一對應。
var book = {};
Object.defineProperty(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和edition)和一個訪問器屬性(year)。最終的對象與上一節中定義的對象相同。唯一的區別是這裏的屬性都是在同一時間創建的。
4. 讀取屬性的特性
- Object.getOwnPropertyDescriptor()方法,可以取得給定屬性的描述符。接收兩個參數:①屬性所在的對象②讀取其描述的屬性名稱。
- 返回值是一個對象,如果是訪問器屬性,這個對象的屬性有configurable、enumerbale、get和set。如果是數據屬性,這個對象的屬性有configurable、emnuerable、writable和values。
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"