JavaScript Object 静态方法之 Object.defineProperties()和Object.defineProperty()

504 2 年前
Object.defineProperties()和Object.defineProperty()都是定义或修改对象属性的特性的方法,Object.defineProperties()一次可以操作一个或多个属性,Object.defineProperty()一次只能操作一个。

Object.defineProperties()

在一个对象上添加或修改一个或者多个自有属性,并返回该对象 Object.defineProperties(obj, props) obj:将要被添加属性或修改属性的对象,props:该对象的一个或多个键值对定义了将要为对象添加或修改的属性的具体配

var obj = {};
Object.defineProperties(obj, {
  "property1": {
    value: true,
    writable: true
  },
  "property2": {
    value: "Hello",
    writable: false
  }
  // 等等.
});
var obj = {};
Object.defineProperties(obj, {
    newDataProperty: {
        value: 101,
        writable: true,
        enumerable: true,
        configurable: true
    },
    newAccessorProperty: {
        set: function (x) {
            this.newaccpropvalue = x;
        },
        get: function () {
            return this.newaccpropvalue;
        },
        enumerable: true,
        configurable: true
    }});

// Set the accessor property value.
obj.newAccessorProperty = 10;
console.log(obj.newAccessorProperty)

Object.defineProperty()

将属性添加到对象,或修改现有属性的特性 Object.defineProperty(obj, propertyname, descriptor) obj为需要定义的属性对象; propertyname为需定义或修改的属性的名字; descriptor为将被定义或修改的属性的描述符。 返回值:返回传入函数的对象,即第一个参数obj 对象里目前存在的属性描述符有两种主要形式:数据描述符存取描述符。数据描述符是一个拥有可写或不可写值的属性。存取描述符是由一对 getter-setter 函数功能来描述的属性。描述符必须是两种形式之一;不能同时是两者。

数据描述符和存取描述符均具有以下可选键值

  • configurable:当且仅当该属性的 configurable 为 true 时,该属性才能够被改变,也能够被删除。默认为 false。
  • enumerable:当且仅当该属性的 enumerable 为 true 时,该属性才能够出现在对象的枚举属性中。默认为 false。

数据描述符同时具有以下可选键值

  • value:该属性对应的值。可以是任何有效的 JavaScript 值(数值,对象,函数等)。默认为 undefined。
  • writable:当且仅当该属性的 writable 为 true 时,该属性才能被赋值运算符改变。默认为 false。

存取描述符同时具有以下可选键值

  • get:一个给属性提供 getter 的方法,如果没有 getter 则为 undefined。该方法返回值被用作属性值。默认为 undefined。 -set:一个给属性提供 setter 的方法,如果没有 setter 则为 undefined。该方法将接受唯一参数,并将该参数的新值分配给该属性。默认为 undefined。

属性修改

如果对象已包含一个带指定名称的属性,则会修改该属性的特性。在修改属性时,描述符中未指定的特性保持不变。

1、如果现有属性的 configurable 特性为 false,则唯一允许的修改是将 writable 特性从 true 更改为 false。

2、可以将数据属性更改为访问器属性,反之亦然。如果这样做,描述符中未指定的 configurable 和 enumerable 特性将保留在属性中。描述符中未指定的其他特性将设置为其默认值。

3、可以通过多次调用 Object.defineProperty 函数以增量方式定义可配置的访问器属性。例如,一次 Object.defineProperty 调用可能仅定义一个 get 访问器。稍后调用同一属性名称可能会定义一个 set 访问器。之后,该属性将同时具有 get 访问器和 set 访问器。

4、在未定义 get 访问器时,如果尝试访问属性值,则将返回 undefined 值。在未定义 set 访问器时,如果尝试向访问器属性赋值,则什么也不会发生。

直接给对象的属性赋值取决于 writable,如下:

var book = {};
Object.defineProperties(book, {
    year: {
        value: 2004,
        configurable:false,
        writable:true
    },
    month: {
        value: 8,
        configurable:true,
        writable:false
    }
});

book.year = 2018;
book.month = 2;
console.log(book.year);//2018
console.log(book.month);//8

通过对象属性的 value 特性修改值,只要writableconfigurable有一个为true,就允许改动。

var book = {};
Object.defineProperties(book, {
    year: {
        value: 2004,
        configurable:false,
        writable:true
    },
    month: {
        value: 8,
        configurable:true,
        writable:false
    }
});
Object.defineProperties(book, {
    year: {
        value: 2018,
        configurable:false,
        writable:true
    },
    month: {
        value: 2,
        configurable:true,
        writable:false
    }
});
console.log(book.year);//2018
console.log(book.month);//2
分类栏目
© 2018邮箱:11407215#qq.comGitHub沪ICP备12039518号-6