关于javascript:ObjectdefineProperty学习

2次阅读

共计 1810 个字符,预计需要花费 5 分钟才能阅读完成。

Object.defineProperty

用于在一个对象上定义一个新的属性,或者批改一个已有属性,并返回该对象自身。

应用语法:

Object.defineProperty(obj, prop, descriptor)

obj: 须要被定义属性的对象

prop:被新增或批改的属性的 name 或者 Symbol

descriptor:对于属性的形容

通过赋值操作新增的属性能够在枚举对象属性时(for..in 循环或 Object.keys 办法)被列举,他们的值能够被批改,属性自身也能够被删除。

通过 Object.defineProperty 定义的属性默认是不可更改,也不可枚举。

descriptor 描述符

descriptor 有两种次要类型:data 型和 accessor 型。

data 型定义属性的 value,和 writtable;

accessor 型定义属性的一对 setter 和 getter 函数。

descriptor 必然是两者之一,不会同时既是 data 型又是 accessor 型。

descriptor 可定义的 key:

  • configurable:默认 false

    如果 descriptor 的类型可更改,并且属性自身可被删除,就设置为 true。

  • enumerable:默认 false

    如果属性要在枚举对象属性时被列举,就设置为 true。

  • value:默认 undefined

    对象属性的值

  • writtable:默认 false

    如果属性的值能够通过赋值操作被更改,就设置为 true。

  • get:默认 undefined

    提供属性的一个 getter 函数

    当属性被拜访时,这个函数被调用(继承属性也是如此),函数返回值被用作属性的值。

  • set:默认 undefined

    提供属性的一个 setter 函数

    当属性被赋值时,这个函数被调用,传入的参数被赋值给对应属性。

如果一个 descriptor 没有 valuewritablegetset 中的任意一个 key,则会被当作 data 型的 descriptor。如果一个 descriptor 同时有 data 型和 accessor 型的 key,就会抛出异样 TypeError。

定义 descriptor 时 key 能够不必全副设置,未设置的他们会应用默认值。

例子

  • 批改属性

    当属性曾经存在,应用 Object.defineProperty 就会依据 descriptor 和对象的以后配置尝试去批改属性。

    如果 configurable 为 false,accessor 型的属性的任一 key 的值都不能被更改;而 data 型的属性,如果 writable 是 true 就能够更改 value 值,writable也能够由 true 改为 false。然而不能在 data 型和 accesso 型之间切换。

    configurable为 false 时,如果尝试批改不可配置的 key 的值(临时不论 value 和 writable),将会抛出TypeError,除非新值和旧值雷同。

  • 批改 writable 为 false 的 data 型属性的 value

    通过赋值操作不会批改胜利,也不会抛出异样(严格模式会抛出 TypeError)

  • enumerable

    此 key 的值定义了是否属性能够被 Object.assign() 或者 spead 操作获取到;对于非 Symbols 的属性,也定义了是否会在 for..in()Object.keys()时被列举(Symbol 的属性不会被列举)

  • configurable

    用于管制属性是否可被删除,以及 key 对应的值(除了 value 和 writable)是否可更改。

  • 定制化的 Setters 和 Getters
  • 继承属性

    如果一个 accessor 属性被继承了,当子类对象拜访或批改对应属性时,getset 办法会被调用

    value总是被设置在对象本身,不是在原型上。但如果一个只读的 value 的属性被继承,对属性的批改会被阻止。

兼容

  • Array 对象的 length 属性
  • IE8 的应用

    • 只能够在 DOM 对象上应用
    • data 属性必须设置 configurable、enumerable 和 writable 为 true;accessor 属性须要设置 configurable 为 true、enumerable 为 false
    • 批改一个属性的配置时必须先删除,否则更改有效
  • Chrome 37(及之前版本)

    当尝试在一个函数上定义一个名为 prototype 的属性时有 bug,writable:false不会是冀望中的成果。

参考 MDN 文档: Object.defineProperty()

正文完
 0