image.png

属性描述符

🎈以下各描述符的默认值都是在使用Object.defineProperty定义属性的情况下,注意和使用点运算符定义属性时的区别(最初看的时候由于没注意到这个把我给搞糊涂了😂)

数据描述符与存取描述符均具有

  • configurable
    • 当且仅当该属性的configurable为true时,该属性的属性描述符才能够被改变,同时该属性也能从对应的对象上被删除(delete);
    • 默认为false。
  • enumerable

    • 当且仅当该属性的enumerable为true时,该属性才能够出现在对象的枚举属性中;
    • 默认为false。

      数据描述符独有

  • writable

    • 当且仅当该属性的writable为true时,value才能被赋值运算符改变;
    • 默认为false。
  • value

    • 该属性对应的值,可以是任何有效的JavaScript值(数值、对象、函数等);
    • 默认为undefined。

      存取描述符独有

  • get

    • 一个给属性提供getter的方法,如果没有getter则为undefined;
    • 当访问该属性时,该方法会被执行,该方法会被执行,方法执行时没有参数传入,但是会传入this对象(由于继承关系,this不一定是定义该属性的对象)。
  • set
    • 一个给属性提供setter的方法,如果没有setter则为undefined;
    • 当属性值修改时,触发执行该方法,该方法接受唯一参数,即该属性的新的参数值。

      使用点运算符和Object.defineProperty()为对象添加属性时它们的属性描述符的区别👀

      点运算符添加属性

      该属性的属性描述符中拥有布尔值字段的默认值都是true(Configurable、Enumerable、writable)。
  1. var o = {};
  2. o.a = 1;
  3. // 等同于 :
  4. Object.defineProperty(o, "a", {
  5. value : 1,
  6. writable : true,
  7. configurable : true,
  8. enumerable : true
  9. })

Object.defineProperty()添加属性

  • 该属性的属性描述符中省略的字段将使用它们的默认值,拥有布尔值字段的默认值都是false(Configurable、Enumerable、writable),value、get、set字段默认值为undefined;
  • 一个既没有指定get/set,也没有指定value/writable字段的属性描述符会默认归为数据描述符。
  1. var o = {};
  2. Object.defineProperty(o, "b", {})
  3. // 等同于
  4. Object.defineProperty(o, "b", {
  5. value : undefined,
  6. writable : false,
  7. configurable : false,
  8. enumerable : false
  9. })