属性描述符是什么?
属性描述符是一个普通对象,用于描述一个属性的相关信息
Object.defineProperty(对象,属性)
可以设置对象的属性描述符
Object.definePropertys(对象,属性)
可以设置对象多个属性的属性描述符
通过
Object.getOwnPropertyDescriptor(对象,属性名)
可以得到一个对象的某个属性的属性描述符
- value:属性值
- configurable:该属性的描述符是否可以被修改
- enumerable:该属性是否可以被枚举
- writable:该属性是否可以被重新赋值
通过
Object.getOwnPropertyDescriptors(对象)
可以得到某个对象的所有属性描述符
存取器属性
属性描述符中,如果配置了get和set中的任何一个,则该属性,不再是一个普通属性,而变成了存取器属性。
get和set配置都是函数,读取该属性时,会运行get方法,将get方法的返回值作为属性值,如果给该属性赋值,则会运行set方法。
例子
1.可以修改描述符
const obj = {
a : 1,
b : 2
}
Object.defineProperty(obj, 'a', {
value : 3,
configurable : true, //属性描述符能修改
enumerable : false, //不能枚举 for in无法循环到
writable : false //属性只读
})
obj.a = 4;
console.log(obj);//{a:3,b:2}
//如果重新修改描述符
Object.defineProperty(obj,'a',{
writable:true
})
obj.a = 4;
console.log(obj);
//如果configurable的值为false,那么就不能再次修改描述符
a无法被枚举
for (const key in obj) {
console.log(key);
}
2.另一种配置方法
Object.defineProperties(obj, {
a : {
value : 10,
configurable : false,
enumerable : false,
writable : false
},
b : {
writable : false
}
})
3.获取属性描述符
const obj = {
a : 1,
b : 2
}
Object.defineProperties(obj, {
a : {
value : 10,
configurable : false,
enumerable : false,
writable : false
},
b : {
writable:false
}
})
const props = Object.keys(obj)
console.log(props)
const values = Object.values(obj);
console.log(values);
const desc = Object.getOwnPropertyDescriptor(obj, "a")
console.log(desc);
4.存取器属性
const obj = {
b: 2
}
Object.defineProperty(obj, "a", {
get() {
console.log("运行了属性a的get函数")
return obj._a;
},
set(val){
console.log("运行了属性a的set函数", val)
obj._a = val;
}
})
obj.a = 20 + 10; // set(20 + 10)
console.log(obj.a); // console.log(get())
obj.a = obj.a + 1; // set(obj.a + 1) set(get() + 1)
console.log(obj.a);