1. 程式人生 > >《Javascript 高階程式設計(第三版)》筆記0x8 OOP 理解物件

《Javascript 高階程式設計(第三版)》筆記0x8 OOP 理解物件

         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"