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}
// 设置obj的属性key的属性描述符
Object.defineProperty(obj, "key", {
value: "newVal", // 设置属性的值
writable: false, // 设置属性是否可写
enumerable: true, // 设置属性是否可枚举(可用for ... in ...遍历)
configurable: true // 设置属性是否可配置(可用defineProperty设置)及删除(delete key)
});
//设置常量属性
Object.defineProperty(obj, "key", {
writable: false,
configurable: false
});
阻止对象扩展
var obj = {
a: 6
};
//阻止对象扩展
Object.preventExtensions(obj);
obj.b = 999; //b无法被添加
console.log(obj); //{a: 6}
密封对象
Object.seal(obj);
相当于Object.preventExtensions(obj);
及对obj
对象的所有属性的属性描述符configurable
改成false
。
即:对象不能添加和删除属性。
冻结对象
Object.freeze(obj)
;
相当于
Object.seal(obj);
及对obj对象的所有属性的属性描述符writable
改成false
。
即对象不能添加和删除属性,也不能修改属性的值。
属性访问描述符
访问描述符有两种定义方式
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...
设置了访问器的对象
给对象定义属性访问描述符会在对象中创建不包含值的属性,对这个属性的访问会自动调用隐藏的函数(访问器getter和setter)
网友评论