defineProperty - cw84973570/Learning-notes GitHub Wiki

MDN

Object.defineProperty(obj, prop, descriptor)

  • 用此方法定义的属性和普通属性不同,默认情况下不可枚举、不能修改、不能删除。
// 不能枚举、不能修改、不能删除foo属性
var obj = {}
Object.defineProperty(obj, 'foo', {
  value: 'bar'
})
  • configurable

    • 属性的描述器是否可配置,从字面意思上来理解便是属性的描述器(descriptor)能否被修改。

    • 如果不在描述器中传递该参数,默认为false,即在配置后不能修改描述器,也不能删除该属性,注意delete会返回false,而不会报错。

      var obj = {}
      Object.defineProperty(obj, 'foo', {
        value: 'bar',
        writable: true,
        enumerable: true
      })
      Object.defineProperty(obj, 'foo', {
        value: 'bar',
        writable: true,
        enumerable: false // 报错 Cannot redefine property: foo
      })
      
    • 对于普通属性来说该描述符为true。

    • 如果该描述符为false且writable为true,则可以修改writable和value的值。

  • enumerable

    • 属性是否可枚举,也就是是否可以被for...in循环或Object.keys方法遍历。
    • 如果不在描述器里传递该参数,默认为false。
    • 对于普通属性来说该描述符为true

数据描述器(data descriptor)

  • value

    • 属性的值,默认值为undefined。
  • writable

    • 属性是否可修改,如果不在描述器里传递该参数,默认为false。

访问描述器(accessor descriptor)

  • get

    • 没有arguments但是会有this
    • 因为继承的关系,this可能并不会指向定义该属性的对象。
    • 方法的返回值作为该属性的值。
  • set

    • 只有一个argument,值为设置的值
    • this同get

如果一个访问器没有vaulewritablegetset中的任意一个键,则它被认为是数据描述器。 如果同时有数据描述器和访问描述器,则会报错。