JavaScript面向對象程序設計梳理

一、理解對象

(一)屬性類型

  • ECMA-262定義這些特性是爲了實現JavaScript引擎用的,因此在JavaScript中不能直接訪問它們。

1. 數據類型

  • 數據屬性包含一個數據值的位置。在這個位置可以讀取和寫入值。
  1. ==【Configgurable】:表示能否通過delete刪除屬性從而重新定義屬性。==能否修改屬性的特性,或者能否把屬性修改爲訪問器屬性。默認值爲true。
  2. ==【Enumerable】:表示能否通過for-in循環返回屬性。==默認值爲true。
  3. ==【Writable】:表示能否修改屬性的值。==默認值爲true。
  4. ==【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函數並傳入新值,這個函數負者決定如何處理數據。
  1. 【Configurable】:表示能否通過delete刪除屬性從而重新定義屬性,能否修改屬性的特性,或者能否把屬性修改爲數據屬性。
  2. 【Enumerable】:表示能否通過for-in循環返回屬性。
  3. 【Get】:在讀取屬性時調用的函數,默認值爲undefined。
  4. 【】在寫入屬性時調用的函數,默認值爲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"
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章