ECMAScript中的對象

什麼是對象

ECMAScript中沒有其它面嚮對象語言中類的概念,所以對象的概念也有所不同。在ECMAScript中,對象可以理解爲一組沒有特定順序的鍵值對,每個對象都是基於一個引用類型創建的,可以是原生的引用類型,也可以是開發者自定義的類型。最簡單的創建對象的方式就是創建Object構造函數的實例,再往其中添加屬性和方法。

屬性的類型和它們的特性

ECMAScript中對象的屬性分爲兩種: 數據屬性和訪問器屬性;數據屬性是一個包含數據值的位置,訪問器屬性則包含一對setter和getter,直接定義在對象上的屬性默認爲數據屬性。爲了實現JavaScript引擎,ECMAScript定義了一些特性,用來描述不同屬性的特徵,在JavaScript中無法直接訪問它們。

  • 共用的特性:
    • [[Configurable]]:描述了屬性的三個特徵:一是這個屬性能否使用delete刪除屬性,從而重新定義屬性;二是屬性的特性能否被修改,所以,一旦設置了這個屬性爲false,再去修改包括configurable本身的特性都會報錯,writable特性只能從true設置爲false,但不能從false設置爲true;三是代表了數據屬性和訪問器屬性能否相互轉換。對於直接定義在對象上的屬性,它默認爲true。
    • [[Enumerable]]:描述了屬性是否可枚舉,也就是能否被for in遍歷到。對於直接定義在對象上的屬性,它默認爲true。
  • 數據屬性的專有特性:
    • [[Writable]]:描述了是否可以使用"object.property=value"這樣的方式修改屬性值。對於直接定義在對象上的屬性,它默認爲true。
    • [[Value]]:包含屬性數據值的位置,讀寫都通過這個位置進行。任何情況它的默認值都爲undefined。
  • 訪問器屬性的專有特性:
    • [[Get]]:是一個函數,讀取屬性時會調用它。任何情況它的默認值都爲undefined。
    • [[Set]]:是一個函數,寫入屬性時會調用它。任何情況它的默認值都爲undefined。

修改屬性的特性

  • Object.defineProperty()、Object.defineProperties():

要修改一個屬性的默認特性,只能通過ECMAScript5中的Object.defineProperty()、Object.defineProperties()方法,後者能同時修改多個屬性;它們接收三個參數:屬性所在的對象、屬性名、描述符對象,描述符對象就一個或多個特性的集合;使用這兩個方法定義一個新屬性的時候,[[Configurable]]、[[Enumerable]]、[[Writable]]特性的默認值均爲false 。Object.defineProperty()方法最早竟然是由ie8實現的,但是實現不徹底,只能創建DOM對象的訪問器屬性。

  • 其他方法:

在比較老的Firefox、Safari3、Chorme1和Opera9.5以上的瀏覽器中,可以使用definGetter()和defineSetter()來創建訪問器屬性,但這兩個方法已經從web標準中刪除了,說不定什麼時候某個瀏覽器就不支持了。

不支持Object.defineProperty()的瀏覽器無法修改[[Configurable]]、[[Enumerable]]特性。

讀取屬性的特性

在支持Object.defineProperty()方法的瀏覽器中,可以使用Object.getOwnPropertyDescriptor()方法獲取給定屬性的描述符對象,接收兩個參數:屬性所在的對象和屬性名。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章