《Javascript 高階程式設計(第三版)》筆記0x8 OOP 理解物件
阿新 • • 發佈:2018-12-12
ECMA-262 把物件定義為:“無序屬性的集合,其屬性可以包含基本值、物件或者函式。”嚴格來講,這就相當於說物件是一組沒有特定順序的值。物件的每個屬性或方法都有一個名字,而每個名字都對映到一個值。
每個物件都是基於一個引用型別建立的,這個引用型別可以是原生型別,也可以是開發人員定義的型別。
理解物件
var person = new Object(); person.name = "Nicholas"; person.age = 29; person.job = "Software Engineer"; person.sayName = function(){ alert(this.name); }; ////////////////////////////////////////////////////////////////// var person = { name: "Nicholas", age: 29, job: "Software Engineer", sayName: function(){ alert(this.name); } };
屬性型別
資料屬性
屬性名稱 | 說明 | 預設值 |
Configurable | 能否通過 delete 刪除屬性從而重新定義屬性,能否修改屬性的特性,或者能否把屬性修改為訪問器屬性。 | true |
Enumerable | 能否通過 for-in 迴圈返回屬性 | true |
Writable | 能否修改屬性的值 | true |
Value | 包含這個屬性的資料值。讀取屬性值的時候,從這個位置讀;寫入屬性值的時候,把新值儲存在這個位置 | undefined |
訪問器屬性
訪問器屬性不包含資料值;它們包含一對兒 getter 和 setter 函式(不過,這兩個函式都不是必需的)。在讀取訪問器屬性時,會呼叫 getter 函式,這個函式負責返回有效的值;在寫入訪問器屬性時,會呼叫setter 函式並傳入新值,這個函式負責決定如何處理資料。
屬性名稱 | 說明 | 預設值 |
onfigurable | 能否通過 delete 刪除屬性從而重新定義屬性,能否修改屬性的特性,或者能否把屬性修改為資料屬性 | 對於直接在物件上定義的屬性,預設值為true。 |
Enumerable | 表示能否通過 for-in 迴圈返回屬性。 | 對於直接在物件上定義的屬性,預設true。 |
Get | 在讀取屬性時呼叫的函式。 | undefined |
Set |
在寫入屬性時呼叫的函式。 | undefined |
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
定義多個屬性
由於為物件定義多個屬性的可能性很大, ECMAScript 5 又定義了一個 Object.defineProperties()方法。利用這個方法可以通過描述符一次定義多個屬性。這個方法接收兩個物件引數:第一個物件是要新增和修改其屬性的物件,第二個物件的屬性與第一個物件中要新增或修改的屬性一一對應。
var book = {};
Object.defineProperties(book, {
_year: {
value: 2004
},
edition: {
value: 1
},
year: {
get: function(){
return this._year;
},
set: function(newValue){
if (newValue > 2004) {
this._year = newValue;
this.edition += newValue - 2004;
}
}
}
});
讀取屬性的特性
使用 ECMAScript 5 的 Object.getOwnPropertyDescriptor()方法,可以取得給定屬性的描述符。這個方法接收兩個引數:屬性所在的物件和要讀取其描述符的屬性名稱。返回值是一個物件,如果是訪問器屬性,這個物件的屬性有 configurable、 enumerable、 get 和 set;如果是資料屬性,這個物件的屬性有 configurable、 enumerable、 writable 和 value。
var book = {};
Object.defineProperties(book, {
_year: {
value: 2004
},
edition: {
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");
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"