什么是属性描述符

  1. Property Descriptor 属性描述符,是一个普通对象,用于描述一个属性的相关信息;

  2. 通过 Object.getOwnPropertyDescriptor(对象, 属性名) 可以得到一个对象的某个属性的属性描述符:

    • value:属性值;
    • configurable:该 属性的描述符 是否可以修改,默认值是 false;
    • enumerable:该 属性 是否可以被枚举(for…in、Object.keys、Object.values),默认值是 false;
    • writable:该 属性 是否可以被重新赋值,变成只读属性,默认值是 false;
  3. 如果需要为某个对象添加属性时、修改属性时,配置其属性描述符,可以使用下面的代码:

    Object.defineProperty(对象, 属性名, 描述符);
    Object.defineProperties(对象, 多个属性的描述符);
    

Object.getOwnPropertyDescriptors(对象) 可以得到某个对象的所有属性描述符;

存取器属性

  1. 属性描述符中,如果配置了 getset 中的任何一个,则该属性不再是一个普通属性,而变成了存取器属性;

  2. getset 配置均为函数,如果一个属性是存取器属性,则读取该属性时,会运行 get 方法,将 get 方法得到的返回值作为属性值;如果给该属性赋值,则会运行 set 方法;

    let obj = {
      name: "zhangsan"
    }
    
    Object.defineProperty(obj, "age", {
      get() {
        return obj._age;
      },
      set(val) {
        if (typeof val !== "number") {
          throw new TypeError("年龄必须是一个数字")
        }
        if (val < 0) {
          val = 0;
        } else if (val > 200) {
          val = 200;
        }
        obj._age = val;
      }
    })
    
    obj.age = 12;
    console.log(obj.age);
    
  3. 存取器属性最大的意义,在于可以控制属性的读取和赋值

属性描述符总结

  1. 拥有布尔值的键 configurableenumerablewritable 的默认值都是 false

  2. 属性值和函数的键 valuegetset 字段的默认值为 undefined

  3. 如果一个描述符不具有 valuewritablegetset 中的任意一个键,那么它将被认为是一个数据描述符;如果一个描述符同时拥有 valuewritablegetset 键,则会产生一个异常;

打赏作者
您的打赏是我前进的动力
微信
支付宝
评论

中午好👏🏻,我是 ✍🏻   疯狂 codding 中...

粽子

这有关于产品、设计、开发的问题和看法,还有技术文档和你分享。

相信你可以在这里找到对你有用的知识和教程

了解更多

目录

  1. 1. 什么是属性描述符
  2. 2. 存取器属性
  3. 3. 属性描述符总结