对象的属性描述符:defineProperty

66 阅读2分钟

1.属性描述符

作用:可以精准的添加或修改对象的属性

Object.defineProperty

1.定义

Object.defineProperty()方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回此对象

Object.defineProperty(obj,prop,descriptor)

可接收三个参数

  • obj: 要定义属性的对象
  • prop: 要定义或修改的属性的名称或symbol
  • descriptor: 要定义或修改的属性描述符

2.分类

1.数据属性描述符

特征属性
  1. Configurable:表示属性是否可以通过delete删除属性,是否可以修改它的特性,或者是否可以将它修改为存取属性描述符;

    • 当我们直接在一个对象上定义某个属性时,这个属性的[Configurable]]为true
    • 当我们通过属性描述符定义一个属性时,这个属性的IConfigurable]]默认为false;
  2. Enumerable: 表示属性是否可以通过for-in或Object.keys()返回该属性(译为不可枚举)

    • 同上
  3. Writable: 表示是否可以修改属性的值(是否为只读属性 readonly)

    • 同上
  4. value:属性的value值,读取属性时会返回该值,修改属性时,会对其进行修改

    • 默认情况下这个值时undefined

      示例
      Object.defineProperty(obj,"name",{
        configurable:false, //obj的name属性不可以被删除
        enumerable:false, //obj的name属性不可以枚举
        writable:false, //obj的name属性不写入(只读属性)
        value:"coderwhy" //读取时返回的值
      })
      

2.存取属性描述符

特征属性
  1. Configurable:同上

  2. Enumerable:同上

  3. get:获取属性时会执行的函数,默认为undefined

  4. set:设置属性时会执行的函数,默认为undefined

    示例:
    Object.defineProperty(obj,"name",{
      configurable:true,
      enumerable:false,
      set:function(val){
        console.log("set方法被调用了",val)
      },
      get:function(){
        console.log("get方法被调用了")
      }
    })