Javascript描述符
屬性描述符
value
writable
enumerable
configurable
屬性訪問描述符(訪問器)
setter
getter
屬性描述符的使用
var obj = {
key: "hello"
}
// 查看obj的屬性key的屬性描述符
console.log(Object.getOwnPropertyDescriptor(obj, "key")); //{value: "value", writable: true, enumerable: true, configurable: true}
// 設(shè)置obj的屬性key的屬性描述符
Object.defineProperty(obj, "key", {
value: "newVal", // 設(shè)置屬性的值
writable: false, // 設(shè)置屬性是否可寫
enumerable: true, // 設(shè)置屬性是否可枚舉(可用for ... in ...遍歷)
configurable: true // 設(shè)置屬性是否可配置(可用defineProperty設(shè)置)及刪除(delete key)
});
//設(shè)置常量屬性
Object.defineProperty(obj, "key", {
writable: false,
configurable: false
});
阻止對(duì)象擴(kuò)展
var obj = {
a: 6
};
//阻止對(duì)象擴(kuò)展
Object.preventExtensions(obj);
obj.b = 999; //b無(wú)法被添加
console.log(obj); //{a: 6}
密封對(duì)象
Object.seal(obj);
相當(dāng)于Object.preventExtensions(obj);
及對(duì)obj
對(duì)象的所有屬性的屬性描述符configurable
改成false
。
即:對(duì)象不能添加和刪除屬性。
凍結(jié)對(duì)象
Object.freeze(obj)
;
相當(dāng)于
Object.seal(obj);
及對(duì)obj對(duì)象的所有屬性的屬性描述符writable
改成false
。
即對(duì)象不能添加和刪除屬性,也不能修改屬性的值神汹。
屬性訪問描述符
訪問描述符有兩種定義方式
var obj = {
set a(val) {
console.log("setting a...");
this._a_ = val * 2;
},
get a() {
console.log("getting a...")
return this._a_;
}
};
Object.defineProperty(obj, "b", {
set: function(val) {
console.log("setting b...");
this._b_ = val;
},
get: function() {
console.log("getting b...");
return this._b_;
}
});
obj.a = 2; //setting a...
obj.b = 3; //setting b...
obj.a; //getting a...
obj.b; //getting b...
設(shè)置了訪問器的對(duì)象
給對(duì)象定義屬性訪問描述符會(huì)在對(duì)象中創(chuàng)建不包含值的屬性,對(duì)這個(gè)屬性的訪問會(huì)自動(dòng)調(diào)用隱藏的函數(shù)(訪問器getter和setter)