我想建立一个看起来像这样的对象数组:

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

09-26 07:14