属性描述符
# 属性描述符
property descriptor
属性描述符,是一个普通对象, 用于描述一个属性的信息。
# 获取属性描述符
使用 Object.getOwnPropertyDescriptor(obj,prop)
- vlaue 属性的值
- configurable 该属性的描述符是否可以修改
- enumerable 该属性是否可以枚举
- writable 该属性的值是否可以被重新赋值。
使用 Object.getOwnPropertyDescriptors(obj)
获取一个对象中的所有属性描述。
# 设置属性描述符
Object.defineProperty(obj,prop,setting)
1、configurable
当设置 configurable
为 false 之后,如果继续更改此属性的 configurable,将会报错。
注意:当 configurable
为 false 时,如果将 writable 从 true 改为 false是不会报错的,如果从 false 改为 true 会报错。
const obj = {
a: 1,
b: 2,
};
Object.defineProperty(obj, "a", {
value: 2,
configurable: false,
});
Object.defineProperty(obj, "a", {
value: 3,
configurable: true,
}); // Cannot redefine a
console.log(Object.getOwnPropertyDescriptors(obj));
2、enumerable
如果设置 enumerable 为 false,将会影响使用迭代的一些方法如:
- Object.keys
- Object.values
- Object.entries
const obj = {
a: 1,
b: 2,
};
Object.defineProperty(obj, "a", {
value: 3,
enumerable: false,
});
console.log(Object.keys(obj)); // b
console.log(Object.values(obj)); // 2
console.log(Object.entries(obj)); // ['b',2]
3、writable
如果设置 writable 为 false,此属性将变为只读属性,无法重新赋值,除非将 writable 重新改为 true
const obj = {
a: 1,
b: 2,
};
Object.defineProperty(obj, "a", {
value: 3,
writable: false,
configurable:true,
enumerable:true
});
obj.a = 2;
console.log(obj.a);
Object.defineProperty(obj,'a',{
writable:true,
// enumerable:false,
})
obj.a = 4
console.log(obj);
# 存取器属性
属性描述符中,如果配置了 get 和 set 中的任何一个,则该属性,不再是一个普通属性,而变成了存取器属性。
get 和 set 配置均为函数,如果读取该属性则会调用 get 方法,如果给属性复制,则会调用 set 属性。
const user = {}
Object.defineProperty(user,'name',{
get(){
return this._name;
},
set(val){
this._name = val;
}
})
user.name = 'Lucas' // 调用 set 方法 为_name 赋值
console.log(user.name) // 调用 get 方法 获取 _name 的值。