JavaScript對(duì)象的property屬性詳解
JavaScript中對(duì)象的property有三個(gè)屬性:
1.writable。該property是否可寫。
2.enumerable。當(dāng)使用for/in語(yǔ)句時(shí),該property是否會(huì)被枚舉。
3.configurable。該property的屬性是否可以修改,property是否可以刪除。
在ECMAScript 3標(biāo)準(zhǔn)中,上面三個(gè)屬性的值均為true且不可改:新建對(duì)象的property是可寫的、可被枚舉的、可刪除的;而在ECMAScript 5標(biāo)準(zhǔn)中,可通過(guò)property的描述對(duì)象(property descriptor)來(lái)對(duì)這些屬性進(jìn)行配置和修改。
如果將property的值信息也作為property的屬性來(lái)看的話,對(duì)象中的property擁有四個(gè)屬性:value、writable、enumerable和configurable。
對(duì)于用getter和setter方法來(lái)定義的property,由于其沒(méi)有writable屬性(property是否可寫取決于setter方法是否存在),因此這種property也有四個(gè)屬性:get、set、enumerable和configurable — get和set屬性的值為function。
獲取對(duì)象property的屬性
ECMAScript 5標(biāo)準(zhǔn)中,可以通過(guò)Object.getOwnPropertyDescriptor()來(lái)獲取對(duì)象自身某個(gè)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繼承自原型對(duì)象,則返回undefined。
設(shè)置對(duì)象property的屬性
ECMAScript 5標(biāo)準(zhǔn)中,可以通過(guò)Object.defineProperty()來(lái)設(shè)置對(duì)象自身某個(gè)property的屬性:
Object.defineProperty(a, "y", {
value:3,
writable:true,
enumerable:false,
configuration:true
});
console.log(a.propertyIsEnumerable("y"));//false
如果設(shè)置的property是從原型對(duì)象中繼承而來(lái)的,那么JavaScript將在對(duì)象自身中創(chuàng)建一個(gè)同名的property,這與賦值操作的相關(guān)行為一致:
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訪問(wèn):
Object.defineProperty(a, "y", {
get:function(){return 42;}
});
console.log(a.y);//42
在使用Object.defineProperty()時(shí),property描述對(duì)象中的屬性值可以部分忽略,當(dāng)屬性值有所忽略時(shí),JavaScript中的處理規(guī)則如下:
如果property是新建的,則所有忽略的屬性值均為false或undefined。
如果property已存在,則所有忽略的屬性值維持原樣不變。
批量設(shè)置對(duì)象property的屬性
如果需要一次性設(shè)置多個(gè)property的屬性,可以使用Object.defineProperties()語(yǔ)句。該語(yǔ)句將返回修改后的對(duì)象。
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屬性設(shè)置規(guī)則
當(dāng)對(duì)property屬性進(jìn)行修改時(shí),必須遵循以下規(guī)則。如果違反規(guī)則,JavaScript將報(bào)TypeError錯(cuò)誤:
如果對(duì)象不是extensible的,則只能修改已有property的屬性,無(wú)法添加新的property。
如果property的configurable屬性為false,則無(wú)法修改configurable和enumerable屬性的值,對(duì)于writable屬性,可以將其從true改為false,但無(wú)法將其從false改為true。如果property由getter和setter定義,則getter和setter方法無(wú)法被修改。
如果property的configurable屬性和writable屬性均為false,則property值不可改。如果property的writable屬性為false,但其configurable屬性為true,則property值依然可以修改。
相關(guān)文章
JavaScript對(duì)象、屬性、事件手冊(cè)集合方便查詢
JavaScript對(duì)象、屬性、事件手冊(cè)查詢,對(duì)于學(xué)習(xí)js的朋友方便查找。2010-07-07JavaScript實(shí)現(xiàn)表單驗(yàn)證
這篇文章介紹了JavaScript實(shí)現(xiàn)表單驗(yàn)證的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-05-05詳細(xì)講解JS節(jié)點(diǎn)知識(shí)
最近發(fā)現(xiàn)DOMDocument對(duì)象很重要,還有XMLHTTP也很重要2010-01-01JavaScript學(xué)習(xí)筆記之JS函數(shù)
這篇文章主要簡(jiǎn)單介紹下javascript中函數(shù)的概念以及函數(shù)的參數(shù)、返回值、局部變量、全局變量以及示例分享,是篇非常不錯(cuò)的文章,推薦給大家學(xué)習(xí)下。2015-01-01javascript replace()第二個(gè)參數(shù)為函數(shù)時(shí)的參數(shù)用法
replace()函數(shù)具有替換功能,它可以具有兩個(gè)參數(shù),第一個(gè)參數(shù)可以是要被替換的字符串或者匹配要被替換字符串的正則表達(dá)式,第二個(gè)參數(shù)可以是替換文本或者一個(gè)函數(shù),下面看一下關(guān)于replace()函數(shù)的幾個(gè)代碼實(shí)例2016-12-12javascript定義變量時(shí)加var與不加var的區(qū)別
這篇文章主要介紹了javascript 變量中 var 與不加var的區(qū)別,需要的朋友可以參考下2014-12-12JavaScript中用于四舍五入的Math.round()方法講解
這篇文章主要介紹了JavaScript中用于四舍五入的Math.round()方法講解,是JS入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-06-06Angularjs 設(shè)置全局變量的方法總結(jié)
這篇文章主要介紹了Angularjs 設(shè)置全局變量的方法總結(jié)的相關(guān)資料,需要的朋友可以參考下2016-10-10