JavaScript對象中的訪問器屬性

環境:支持ECMAScript 5 及以上的瀏覽器

條件:必須通過Object.defineProperty或者Object.defineProperties添加

語法

    Object.defineProperty( '目標對象',  '屬性名', {get: function() {},  set: function() {}} );

    Object.defineProperties( '目標對象',  {'屬性對象集'} );

特性

 

  • [[Configurable]]:表示能否通過 delete 刪除屬性從而重新定義屬性,能否修改屬性的特性,或者能否把屬性修改爲數據屬性。對於直接在對象上定義的屬性,這個特性的默認值爲true。 
  • [[Enumerable]]:表示能否通過 for-in 循環返回屬性。對於直接在對象上定義的屬性,這個特性的默認值爲 true。
  • [[Get]]:在讀取屬性時調用的函數。默認值爲 undefined。
  • [[Set]]:在寫入屬性時調用的函數。默認值爲 undefined。

歷史遺留:在這個方法之前,要創建訪問器屬性,一般都使用兩個非標準的方法:__defineGetter__()和__defineSetter__()。這兩個方法最初是由 Firefox 引入的,後來 Safari 3、Chrome 1 和 Opera 9.5 也給出了相同的實現。使用這兩個遺留的方法,可以像下面這樣寫

//定義訪問器的舊有方法

目標對象.__defineGetter__( "屬性", function(){} );

目標對象.__defineSetter__( "屬性", function(value){} );

相關:數據屬性——包含一個數據值的位置。在這個位置可以讀取和寫入值。數據屬性有 4 個描述其行爲的特性。

 

  • [[Configurable]]:表示能否通過 delete 刪除屬性從而重新定義屬性,能否修改屬性的特性,或者能否把屬性修改爲訪問器屬性。這個特性默認值爲 true。
  • [[Enumerable]]:表示能否通過 for-in 循環返回屬性。這個特性默認值爲 true。
  • [[Writable]]:表示能否修改屬性的值。這個特性默認值爲 true。
  • [[Value]]:包含這個屬性的數據值。讀取屬性值的時候,從這個位置讀;寫入屬性值的時候,把新值保存在這個位置。這個特性的默認值爲 undefined。

注意事項

 

  • 通過defineProperty或defineProperties方法定義configurable特性後,屬性的特性除writable外都將不可修改,嘗試修改在非嚴格模式直接忽略,在嚴格模式下會報錯。
  • 不一定非要同時指定 getter 和 setter。只指定 getter 意味着屬性是不能寫,嘗試寫入屬性會被忽略。在嚴格模式下,嘗試寫入只指定了 getter 函數的屬性會拋出錯誤。類似地,只指定 setter 函數的屬性也不能讀,否則在非嚴格模式下會返回 undefined,而在嚴格模式下會拋出錯誤。
  • Object.getOwnPropertyDescriptor()方法,可以取得給定屬性的描述符。這個方法接收兩個參數:屬性所在的對象和要讀取其描述符的屬性名稱。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章