属性描述符

# 属性描述符

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 的值。