我想建立一个看起来像这样的对象数组:
var someObject = {
id,
groupA {
propertyA: 0,
propertyB: 0,
},
groupB {
propertyA: 0,
propertyB: 0
totals {}
}
并添加以下复合属性:
Object.defineProperty(someObject.groupA, "propertyC",
{
get: function() {
return someObject.groupA.propertyA + someObject.groupA.propertyB;
}
});
并使用相同的方法添加属性:
groupB.propertyC
-> groupB.propertyA + groupB.propertyB
totals.propertyA
-> groupA.propertyA + groupB.propertyA
totals.propertyB
-> groupA.propertyB + groupB.propertyB
totals.propertyC
-> groupA.propertyC + groupB.propertyC
我通过将所有这些代码放入一个函数中来完成所有工作,从而将someObject添加到了数组中。
但是后来我开始思考,不需要为每个对象创建只读复合属性,并且可能在原型中。
这有意义吗?可能吗?如果可以,怎么办?
最佳答案
可以办到。您只需要确保groupA和groupB继承自具有Composite属性的对象即可。
var proto = {};
Object.defineProperty(proto, 'propertyC', {
get : function() { return this.propertyA + this.propertyB; }
});
var someObj = {
id : '1',
groupA : Object.create(proto, {
propertyA : { value : 1 }, propertyB : { value : 2 }
}),
groupB : Object.create(proto, {
propertyA : { value : 3 }, propertyB : { value : 4 }
}),
totals : Object.create(proto, {
propertyA : { get : function() { return someObj.groupA.propertyA + someObj.groupB.propertyA; } },
propertyB : { get : function() { return someObj.groupA.propertyB + someObj.groupB.propertyB; } }
})
}
// Usage:
console.log(someObj.groupA.propertyC); // 3
console.log(someObj.groupB.propertyC); // 7
console.log(someObj.totals.propertyC); // 10