五、內(nèi)部屬性類型:內(nèi)部屬性無法直接訪問,ECMAScript5把它們放在兩對方括號中,分為數(shù)據(jù)屬性和訪問器屬性
[1]數(shù)據(jù)屬性包含一個(gè)數(shù)據(jù)值的位置,在這個(gè)位置可以讀取和寫入值。數(shù)據(jù)屬性有4個(gè)特性:
a、[[Configurable]]: 表示能否通過delete刪除屬性從而重新定義屬性,能否修改屬性的特性,或者能否把屬性修改為訪問器屬性,直接在對象上定義的屬性,默認(rèn)值為true
b、[[Enumerable]]: 表示能否通過for-in循環(huán)返回屬性,直接在對象上定義的屬性,默認(rèn)值為true
c、[[Writable]]: 表示能否修改屬性的值,直接在對象上定義的屬性,默認(rèn)值為true
d、[[Value]]: 包含這個(gè)屬性的數(shù)據(jù)值,讀取屬性值的時(shí)候,從這個(gè)位置讀;寫入屬性值的時(shí)候,把新值保存在這個(gè)位置。直接在對象上定義的屬性,默認(rèn)值為undefined
[2]訪問器屬性不包含數(shù)據(jù)值,包含一對getter和setter函數(shù)(不過這兩個(gè)函數(shù)不是必需的)。讀取訪問器屬性時(shí),會調(diào)用getter函數(shù),這個(gè)函數(shù)負(fù)責(zé)返回有效的值;在寫入訪問器屬性時(shí),會調(diào)用setter函數(shù)并傳入新值,這個(gè)函數(shù)負(fù)責(zé)決定如何處理函數(shù)。訪問器屬性有如下4個(gè)特性:
a、[[Configurable]]: 表示能否通過delete刪除屬性從而重新定義屬性,能否修改屬性的特性,或者能否把屬性修改為訪問器屬性。直接在對象上定義的屬性,默認(rèn)值為true
b、[[Enumerable]]: 表示能否通過for-in循環(huán)返回屬性,直接在對象上定義的屬性,默認(rèn)值為true
c、[[Get]]: 在讀取屬性時(shí)調(diào)用的函數(shù)。默認(rèn)值為undefined
d、[[Set]]: 在寫入屬性時(shí)調(diào)用的函數(shù)。默認(rèn)值為undefined
六、修改內(nèi)部屬性:使用ECMAScript5的object.defineProperty()方法,該方法接收三個(gè)參數(shù):屬性所在的對象、屬性的名字和一個(gè)描述符對象
[注意1]IE8是第一個(gè)實(shí)現(xiàn)Object.defineProperty()方法的瀏覽器版本。然而,這個(gè)版本的實(shí)現(xiàn)存在諸多限制:只能在DOM對象上使用這個(gè)方法,而且只能創(chuàng)建訪問器屬性。由于實(shí)現(xiàn)不徹底,不建議在IE8中使用Object.defineProperty()方法
[注意2]不支持Object.defineProperty()方法的瀏覽器中不能修改[[Configurable]]和[[Enumerable]]
[1]修改數(shù)據(jù)屬性
//不是在對象上定義的屬性,Configurable、Enumerable、Writable為false var person = {}; Object.defineProperty(person,'name',{ value: 'Nicholas' }); alert(person.name);//'Nicholas' person.name = 'Greg'; alert(person.name);//'Nicholas'
[注意]一旦把屬性定義為不可配置的,就不能再把它變回可配置了,也就是說可以多次調(diào)用Object.defineProperty()修改同一屬性,但在把configurable設(shè)置為false之后,就有限制了
[2]修改訪問器屬性
[注意1]只指定getter意味著屬性是不能寫
[注意2]只指定setter意味著屬性不能讀
【補(bǔ)充】創(chuàng)建訪問器屬性的用兩個(gè)非標(biāo)準(zhǔn)的方法:__defineGetter__()和__defineSetter__()
七、定義多個(gè)屬性:ECMAScript5定義了一個(gè)Object.defineProperties()方法,利用這個(gè)方法可以通過描述符一次定義多個(gè)屬性,這個(gè)方法接收兩個(gè)對象參數(shù):第一個(gè)對象是要添加和修改其屬性的對象,第二個(gè)對象的屬性與第一個(gè)對象要添加或修改的一一對應(yīng)
八、讀取屬性特性:使用ECMAScript5的Object.getOwnPropertyDescriptor()方法,可以取得給定屬性的描述符。該方法接收兩個(gè)參數(shù):屬性所在對象和要讀取其描述符的屬性名稱,返回值是一個(gè)對象。
[注意]可以針對任何對象——包括DOM和BOM對象,使用Object.getOwnPropertyDescriptor()方法
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com