一、定义
Object.defineProperties() 方法直接在一个对象上定义新的属性或修改多个现有属性,并返回该对象。
二、语法
Object.defineProperties(obj, props);
参数
obj:要定义或修改属性的对象
props:要新增或修改的属性对象集合
props的格式是:{ property: property_descriptor_obj }
返回值
被传递给函数的对象
该方法其实就是Object.defineProperty()的加强版,Object.defineProperty()一次只能新增或修改一个属性,该方法可以同时新增或修改多个属性。
三、示例
示例1:同时定义多个属性
var obj = Object.defineProperties({}, {
x: { value: 1, writable: true, enumerable: true, configurable: true },
y: { value: 1, writable: true, enumerable: false, configurable: false },
r: { get: function () { return Math.sqrt(this.x * this.x + this.y * this.y); },
enumerable: true, configurable: true }
});
obj.x; // 1
obj.y; // 1
obj.r; // 1.4142135623730951
示例2:当出现冲突的时候,错误后续的属性不生效,错误发生前的属性生效
// 首先定义一个不可配置的属性a
var obj = Object.defineProperty({}, 'a', {
value: 1,
enumerable: true,
writable: true,
configurable: false
});
// 同时新增属性b和d,修改已有属性a
Object.defineProperties(obj, {
b: { value: 2, writable: true, enumerable: true, configurable: true },
a: { value: 3, writable: true, enumerable: false, configurable: false },
c: { value: 4, writable: true, enumerable: true, configurable: true },
});
// 这里会触发TypeError,因为a已经是不可配置的属性,无法重新配置
obj.b; // 2
obj.a; // 1
obj.c; // undefined
由上述代码实践可知,当Object.defineProperties()方法同时定义或修改多个属性的时候,如果发生错误,那么发生错误之前定义或修改的属性还是会生效,而发出错误所在行及之后的属性不会生效。