js面向對象
ECMA-262第5版在定義只有內部才用的特性(attribute)時,描述了屬性(property)的各類特徵。ECMA-262定義這些特性是爲了實現javascript引擎用的,所以在javascript中不能直接訪問它們。爲了表示特性時內部值,該規範把它們放在了兩對方括號中,例如[[Enumerable]]。javascript
1數據屬性
數據屬性包含一個數據值的位置,在這個位置能夠讀取和寫入值。數據屬性有4個描述其行爲的特性java
一、[[Configurable]]:表示可否經過delete刪除屬性從而從新定義屬性,可否修改屬性的特性,或者可否把屬性修改成訪問器屬性。直接在對象上定義的屬性,它們的這個特性默認值爲true函數
二、[[Enumerable]]:表示可否經過for-in循環返回屬性,直接在對象上定義的屬性,它們的這個特性默認值爲truespa
三、[[Writable]]:表示可否修改屬性的值,直接在對象上定義的屬性,它們的這個特性默認值爲true對象
四、[[Value]]:包含這個屬性的數據值。讀取屬性值的時候,從這個位置讀取,寫入值得時候,把新值保存在這個位置。這個特性得默認值爲undefinedip
直接在對象上定義的屬性,它們的[[Configurable]]、[[Enumerable]]、[[Writable]]特性都被設置爲true,[[Value]]特性被設置爲了指定的值get
*要修改默認的特性,必須使用ECMAScript5的Object.defineProperty()方法。這個方法接收三個參數:1屬性所在的對象、2屬性的名字、3一個描述符對象。其中描述符對象的屬性必須是configurable、enumerable、writable、value。設置其中一個或i多個值,能夠修改對應的特性*it
2訪問器屬性
訪問器屬性不包含數據值,它們包含一對getter和setter函數(這兩個函數都不是必須的)。在讀取訪問器屬性時會調用getter函數,這個函數會負責返回有效的值,在寫入訪問器屬性時,會調用setter函數並傳入新值。這個函數負責決定如何處理數據。訪問器屬性有以下4個特性table
一、[[Configurable]]:表示可否經過delete刪除屬性從而從新定義屬性,可否修改屬性的特性,或者可否把屬性修改成數據屬性。直接在對象上定義的屬性,這個特性的默認值爲trueclass
二、[[Enumerable]]:表示可否經過for-in循環返回屬性。直接在對象上定義的屬性,這個特性的默認值爲true
三、[[Get]]:在讀取屬性時調用的函數。默認值爲undefined
四、[[Set]]:在寫入屬性時調用的函數。默認值爲undefined
*訪問器屬性不能直接定義,必須使用Object.defineProperty()來定義。*
經過,Object.getOwnPropertyDescriptor()方法獲取給定屬性的描述符,兩個參數,屬性所在的對象和屬性名稱,返回一個對象。IE9以上支持