JavaScript中對象的property有三個屬性:
1.writable。該property是否可寫。
2.enumerable。當使用for/in語句時,該property是否會被枚舉。
3.configurable。該property的屬性是否可以修改,property是否可以刪除。
在ECMAScript 3標準中,上面三個屬性的值均為true且不可改:新建對象的property是可寫的、可被枚舉的、可刪除的;而在ECMAScript 5標準中,可通過property的描述對象(property descriptor)來對這些屬性進行配置和修改。
如果將property的值信息也作為property的屬性來看的話,對象中的property擁有四個屬性:value、writable、enumerable和configurable。
對于用getter和setter方法來定義的property,由于其沒有writable屬性(property是否可寫取決于setter方法是否存在),因此這種property也有四個屬性:get、set、enumerable和configurable ― get和set屬性的值為function。
獲取對象property的屬性
ECMAScript 5標準中,可以通過Object.getOwnPropertyDescriptor()來獲取對象自身某個property的屬性信息:
設置對象property的屬性
ECMAScript 5標準中,可以通過Object.defineProperty()來設置對象自身某個property的屬性:
如果property是新建的,則所有忽略的屬性值均為false或undefined。
如果property已存在,則所有忽略的屬性值維持原樣不變。
批量設置對象property的屬性
如果需要一次性設置多個property的屬性,可以使用Object.defineProperties()語句。該語句將返回修改后的對象。
當對property屬性進行修改時,必須遵循以下規則。如果違反規則,JavaScript將報TypeError錯誤:
如果對象不是extensible的,則只能修改已有property的屬性,無法添加新的property。
如果property的configurable屬性為false,則無法修改configurable和enumerable屬性的值,對于writable屬性,可以將其從true改為false,但無法將其從false改為true。如果property由getter和setter定義,則getter和setter方法無法被修改。
如果property的configurable屬性和writable屬性均為false,則property值不可改。如果property的writable屬性為false,但其configurable屬性為true,則property值依然可以修改。
新聞熱點
疑難解答