1.屬性類型(數(shù)據(jù)屬性和訪問器屬性)
要修改屬性默認(rèn)的特性,必須使用 ECMAScript 5的 Object.defineProperty()方法。
這個方法 接收三個參數(shù):屬性所在的對象、屬性的名字和一個描述符對象。
1.1數(shù)據(jù)屬性
? 數(shù)據(jù)屬性包含一個數(shù)據(jù)值的位置。在這個位置可以讀取和寫入值。數(shù)據(jù)屬性有4個描述其行為的特性
? 1.1.1 [[Configurable]]:表示能否通過delete刪除屬性從而重新定義屬性,能否修改屬性的特性,或者能否把屬性修改為訪問器屬性。
[[Enumberable]]:表示能否通過for-in循環(huán)返回屬性。
[[Writable]]:表示能否修改屬性的值。
[[Value]]:包含這個屬性的數(shù)據(jù)值。
在調(diào)用 Object.defineProperty()方法時,如果不指定,configurable、enumerable 和 writable 特性的默認(rèn)值都是 false。
把 configurable 設(shè)置為 false,表示不能從對象中刪除屬性。如果對這個屬性調(diào)用 delete,則 在非嚴(yán)格模式下什么也不會發(fā)生,而在嚴(yán)格模式下會導(dǎo)致錯誤。而且,一旦把屬性定義為不可配置的, 就不能再把它變回可配置了。此時,再調(diào)用 Object.defineProperty()方法修改除 writable 之外 的特性,都會導(dǎo)致錯誤。
1.2訪問器屬性
訪問器屬性不包含數(shù)據(jù)值;它們包含一對兒 getter和 setter函數(shù)。
在讀取訪問器屬性時,會調(diào)用 getter函數(shù),這個函數(shù)負(fù)責(zé)返回有效的值;在寫入訪問器屬性時,會調(diào)用 setter函數(shù)并傳入新值,這個函數(shù)負(fù)責(zé)決定如何處理數(shù)據(jù)。
1.2.1 [[Configurable]]:表示能否通過 delete 刪除屬性從而重新定義屬性,能否修改屬性的特性,或者能否把屬性修改為數(shù)據(jù)屬性。對于直接在對象上定義的屬性,這個特性的默認(rèn)值為 true。
[[Enumerable]]:表示能否通過 for-in 循環(huán)返回屬性。對于直接在對象上定義的屬性,這 個特性的默認(rèn)值為 true。
[[Get]]:在讀取屬性時調(diào)用的函數(shù)。默認(rèn)值為 undefined。
[[Set]]:在寫入屬性時調(diào)用的函數(shù)。默認(rèn)值為 undefined。
訪問器屬性不能直接定義,必須使用 Object.defineProperty()來定義
2.定義多個屬性
Object.defineProperties()方法可以通過描述符一次定義多個屬性。
這個方法接收兩個對象參數(shù):第一 個對象是要添加和修改其屬性的對象,第二個對象的屬性與第一個對象中要添加或修改的屬性一一對應(yīng)。
3.讀取屬性的特性
Object.getOwnPropertyDescriptor()方法,可以取得給定屬性的描述符。
這個方法接收兩個參數(shù):屬性所在的對象和要讀取其描述符的屬性名稱。返回值是一個對象,如果 是訪問器屬性,這個對象的屬性有 configurable、enumerable、get 和 set;如果是數(shù)據(jù)屬性,這 個對象的屬性有 configurable、enumerable、writable 和 value。