對(duì)象屬性的特性描述符固灵,可以理解為對(duì)象屬性的屬性。
????一個(gè)對(duì)象屬性有上面這些屬性劫流,其中value巫玻,和get,set是用來(lái)定義屬性值的困介,這兩種定義方式只能采取一種大审,不能同時(shí)出現(xiàn)蘸际。
????剩下的configurable座哩,enumerable根穷,writable用來(lái)描述一個(gè)對(duì)象屬性的讀寫特性。這三個(gè)都是boolean值尘惧。
????configurable表示可配置性,enumerable表示可枚舉性贰逾,writable表示可修改性富玷。
????configurable表示屬性定義后焦匈,是否還可以通過(guò)Object.defineProperty來(lái)修改屬性的特性管挟,為false時(shí)拳芙,再次調(diào)用Object.defineProperty方法修改屬性特性會(huì)報(bào)錯(cuò)。并且為false時(shí)睹限,是不能通過(guò)delete操作符刪除此屬性的。只有為true時(shí)才可以修改或者刪除。
????enumerable表示的是此屬性是否可以進(jìn)行枚舉痒钝,為false時(shí),在for...in循環(huán),Object.keys()中都不會(huì)出現(xiàn)此屬性晌块。為true時(shí),才可以通過(guò)遍歷獲得此屬性靠汁。
????writable表示此屬性是否可以被修改賦值,為false時(shí)澳叉,修改屬性值無(wú)效成洗,嚴(yán)格模式下會(huì)報(bào)錯(cuò)的。
這三個(gè)讀寫配置屬性的默認(rèn)值都為false。
Object.defineProperty
????Object.defineProperty方法用來(lái)在對(duì)象上定義添加一個(gè)屬性,或者修改一個(gè)屬性碴裙。
????通過(guò)Object.defineProperty()方法給對(duì)象添加屬性,可以設(shè)置屬性的讀寫特征描述符诱贿。然后我們之后想要將name屬性的writable改為true凭豪,可以像下面這樣寫:
????對(duì)于對(duì)象已有屬性使用Object.defineProperty方法,會(huì)修改這個(gè)屬性的值或者相應(yīng)的特征描述符粪般。二次使用Object.defineProperty方法有點(diǎn)像$.extend對(duì)象賦值方式。
????Object.defineProperty方法就是用來(lái)添加或者修改對(duì)象屬性的,并且可以通過(guò)屬性特征描述符來(lái)控制屬性的可配置性,可枚舉性础拨,可修改性。
Object.defineProperties
????Object.defineProperties和Object.defineProperty的關(guān)系就如同他們的名字一樣,是單數(shù)和復(fù)數(shù)的關(guān)系。Object.defineProperty一次只能定義一個(gè)屬性鸽疾,而Object.defineProperties一次可以定義多個(gè)屬性:
Object.defineProperties(obj,?props)
????語(yǔ)法上,Object.defineProperties只有兩個(gè)參數(shù)豺鼻,比Object.defineProperty少了一個(gè)參數(shù)檩奠。
Object.defineProperties的第二個(gè)參數(shù)是一個(gè)屬性集合對(duì)象圣猎。
????通過(guò)以上的代碼形式,使用Object.defineProperties可以一次定義或修改對(duì)象上N多個(gè)屬性慢显,是為了給Object.defineProperty提供方便而生的。
????Object.defineProperty和Object.defineProperties這兩個(gè)屬性在IE9+瀏覽器中都支持疾呻。