一、定義
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()方法同時定義或修改多個屬性的時候,如果發生錯誤,那么發生錯誤之前定義或修改的屬性還是會生效,而發出錯誤所在行及之后的屬性不會生效。
