属性描述符

73 阅读1分钟

平时我们在js中声明一个对象,他是可以随意赋值的如const a = {name:"zs"}=> a = {name:"ls"},这本身是没有问题的,但是当我们有一个源数据并且不想它被修改,这种情况应该怎么办呢?这就需要使用属性描述符来处理这个问题。

我们可以通过Object.getOwnPropertyDescriptors(data)Object.getOwnPropertyDescriptor(data,“key”)来对象所有数据的描述符和获取单个数据的描述符,它们会返回以下属性:

  • value该属性的值(仅针对数据属性描述符有效)
  • writable当且仅当属性的值可以被改变时为true。(仅针对数据属性描述有效) 设置读写
  • configurable当且仅当指定对象的属性描述可以被改变或者属性可被删除时,为true。
  • enumerable当且仅当指定对象的属性可以被枚举出时,为 true。

有了上述属性后我们就可以通过Object.defineProperty()来修改属性描述符。

const data = { name: "张三", age: 5 };
Object.defineProperty(data, "age", {
  get() {
    //读取器 getter
    return 1;
  },
  set(value) {
    //设置器 setter
    throw new Error("不可以给该属性赋值");
  },
});