📜  Javascript Object.defineProperty()

📅  最后修改于: 2020-09-27 06:44:04             🧑  作者: Mango

JavaScript Object.defineProperty()方法添加或修改对象上的现有属性,然后返回该对象。

defineProperty()方法的语法为:

Object.defineProperty(obj, prop, descriptor)

使用Object类名称调用作为静态方法的defineProperty()方法。


defineProperty()参数

defineProperty()方法采用:

  • obj-在其上定义属性的对象。
  • prop-要定义或修改的属性的名称或Symbol
  • 描述符 -定义或修改的属性的描述符。

对象中存在的属性描述符有两种类型:数据描述符和访问器描述符。它们可以具有以下可选属性。

  • configurable
  • enumerable

数据描述符也可以具有:

  • value
  • writable

访问器描述符也可以具有:

  • get
  • set

从defineProperty()返回值
  • 返回传递给函数的对象。

注意:

  • 默认情况下,使用Object.defineProperty()添加的值是不可变的且不可枚举。
  • 如果描述符不具有valuewritablegetset键,则将其视为数据描述符。如果描述符同时具有valuewritable以及getset键,则将引发异常。

示例:向对象添加数据属性
let obj = {};

// with a data property descriptor
Object.defineProperty(obj, "property1", {
  value: 788,
  writable: true,
  enumerable: true,
  configurable: true,
});

console.log(obj.property1); // 788

// with an accessor property descriptor
Object.defineProperty(obj, "property2", {
  get() {
    console.log("Getting Value...");
    return val;
  },
  set(newVal) {
    console.log("Setting Value...");
    val = newVal;
  },
  enumerable: true,
  configurable: true,
});

obj.property2 = 6969; // Setting Value...

console.log(obj.property2); // 6969

输出

788
Setting Value...
Getting Value...
6969

我们不能混合使用数据描述符和访问器属性描述符,因为它会引发错误。

要修改属性,对象的writable属性必须为true ,否则它不会在严格模式下修改并引发错误。

enumerable属性属性定义该属性是由Object.assign()还是散布运算符的。

configurable属性同时控制是否可以从对象中删除属性以及是否可以更改其属性( valuewritable除外)。


推荐阅读: Javascript对象defineProperties()