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的屬性資訊:
var o = {x:1}; var a = Object.create(o); a.y = 3; console.log(Object.getOwnPropertyDescriptor(a, "y"));//Object {configurable=true, enumerable=true, writable=true, value=3} console.log(Object.getOwnPropertyDescriptor(a, "x"));//undefined
可以看到,如果property不存在或property繼承自原型對象,則傳回undefined。
設定物件property的屬性
ECMAScript 5標準中,可以透過Object.defineProperty()來設定物件本身某個property的屬性:
Object.defineProperty(a, "y", { value:3, writable:true, enumerable:false, configuration:true }); console.log(a.propertyIsEnumerable("y"));//false
如果設定的property是從原型物件繼承而來的,那麼JavaScript就會在物件本身中建立一個同名的property,這與賦值運算的相關行為一致:
Object.defineProperty(a, "x", { value:1, writable:true, enumerable:false, configuration:true }); console.log(a.propertyIsEnumerable("x"));//false console.log(o.propertyIsEnumerable("x"));//true
除了修改property的屬性,也可以將property改為用getter或setter存取:
Object.defineProperty(a, "y", { get:function(){return 42;} }); console.log(a.y);//42
在使用Object.defineProperty()時,property描述物件中的屬性值可以部分忽略,當屬性值有所忽略時,JavaScript中的處理規則如下:
如果property是新建的,則所有忽略的屬性值都是false或undefined。
如果property已存在,則所有忽略的屬性值維持原樣不變。
批次設定物件property的屬性
如果需要一次設定多個property的屬性,可以使用Object.defineProperties()語句。該語句將傳回修改後的物件。
Object.defineProperties(a, { "y":{value:79, writable:true, enumerable:true, configurable:true}, "z":{value:99, writable:true, enumerable:true, configurable:true} }); console.log(a);//Object {y=79, z=99}
property屬性設定規則
當對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值仍可修改。
以上是JavaScript中如何取得並設定property屬性程式碼詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!