国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

JavaScript對象的property屬性詳解

2024-05-06 16:03:30
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了JavaScript對象的property屬性,詳細講解了property的各種屬性,需要的朋友可以參考下

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值依然可以修改。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 龙南县| 青岛市| 石柱| 乌拉特后旗| 哈尔滨市| 易门县| 台东市| 镇原县| 游戏| 灵川县| 麦盖提县| 扎赉特旗| 洞口县| 澄城县| 行唐县| 驻马店市| 水城县| 昂仁县| 临夏县| 金乡县| 周宁县| 淳安县| 榆社县| 射洪县| 闸北区| 滕州市| 衡山县| 延津县| 上蔡县| 榆中县| 故城县| 赣榆县| 含山县| 南昌市| 石景山区| 万源市| 普洱| 吴旗县| 兴海县| 高邮市| 和平区|