1. 程式人生 > >Js面向物件程式設計——屬性型別,訪問器屬性

Js面向物件程式設計——屬性型別,訪問器屬性

Js面向物件程式設計——屬性型別,訪問器屬性

訪問器屬性

  • 訪問器屬性不包含資料值;它們包含一對兒getter和setter函式(不過,這倆個函式都不是必需的)。在讀取訪問器屬性時,回撥用getter函式,這個函式負責返回有效的值;在寫入訪問器屬性時,回撥用setter函式並傳入新值,這個函式負責決定如何處理資料。訪問器有如下幾個特性:
  1. [[Configurable]]: 表示能否通過delete刪除屬性從而重新定義屬性,能否修改屬性的特性,或者能否把屬性修改為資料屬性。對於直接在物件上定義的屬性,這個特性的預設值為true。
  2. [[Enumerable]]:表示能否通過for-in 迴圈返回屬性。對於直接在物件上定義的屬性,這個特性的預設值為true。
  3. [[Get]] :在讀取屬性時呼叫的函式。預設值為undefined.
  4. [[Set]] :在寫入屬性時呼叫的函式。預設值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;
			}
		}
	});
console.log(book.year)//2004
book.year = 2005;
console.log(book.year)//2005
console.log(book.edition)//2
				
  • 以上程式碼建立了一個book物件,並給它定義倆個預設的屬性:_year和edition。_year前面的下劃線時一種常用的記號,用於表示只能通過物件方法訪問的屬性。而訪問器屬性year則包含一個getter函式和一個setter函式。getter函式返回_year的值,settter函式通過計算來確定正確的版本。因此,把year屬性修改為2005會導致_year變成2005,而edition變為2.這是使用訪問器屬性的常見方式,即設定一個屬性的值會導致其他屬性發生變化。
  • 不一定非要同時指定getter和setter。值指定getter意味著屬性是不能寫,嘗試寫入屬性會被忽略。在嚴格模式下,嘗試寫入只指定了getter函式的屬性會丟擲錯誤。類似的,沒有指定setter函式的屬性也不能讀,否則在非嚴格模式下會返回undefined,而在嚴格模式下會丟擲錯誤。

參考紅寶書