有没有一种简写的方法可以在javascript中包装类的组件对象的属性?

有没有一种简写的方法可以在javascript中包装类的组件对象的属性?,javascript,javascript-objects,Javascript,Javascript Objects,请参阅下面的代码片段: 分类栏{ 构造的{ 这个。y=y; } } 福班{ 构造器X,y{ 这个.x=x; this.bar=新的Bary; } 发狂{ 把这个还给我; } 塞特伊瓦尔{ 这个.bar.y=val; } } const foo=新foo 1,2; console.logfoo.x,foo.y Yoo可以扩展Bar类并调用值为y的超类构造函数 分类栏{ 构造的{ 这个。y=y; } } 类Foo扩展条{ 构造器X,y{ 超级; 这个.x=x; } } const foo=新fo

请参阅下面的代码片段:

分类栏{ 构造的{ 这个。y=y; } } 福班{ 构造器X,y{ 这个.x=x; this.bar=新的Bary; } 发狂{ 把这个还给我; } 塞特伊瓦尔{ 这个.bar.y=val; } } const foo=新foo 1,2; console.logfoo.x,foo.y Yoo可以扩展Bar类并调用值为y的超类构造函数

分类栏{ 构造的{ 这个。y=y; } } 类Foo扩展条{ 构造器X,y{ 超级; 这个.x=x; } } const foo=新foo 1,2;
console.logfoo.x,foo.y 您可以使用助手方法通过Object.defineProperties以编程方式创建getter/setter对:


不,没有。当然,你可以编写一个helper函数,只需传递Foo.prototype,bar,y就可以了,但是对于一个属性来说,这没有什么好处。我不知道你的目标是什么,但是你是否考虑过使用继承而不是合成?@贝尔吉我有兴趣提出这个想法——我有一个用例,这个模式是多次使用第三方游戏中的对象来包装的。engine@jonchun那么装饰图案呢?您必须创建一个接受Bar实例的包装器Foo,然后将一些调用委托给它,但也有自己的调用。为什么需要包装这个?你现在没有添加任何额外的行为。在需要向引擎原语添加额外行为之前,只使用引擎原语可能是值得的;Baz的工作原理和Bar一模一样,我希望这个.z是这个意思。z@jonchun:是的,在这种情况下,您可能必须使用多级inheritance@jonchun:也许你可以使用Object.assign谢谢你的帮助。我喜欢你在这里所做的,但不幸的是我忘了提到我正在为这个特殊的项目使用typescript,如果我尝试这样做,它会哭。我仍然认为你的答案是正确的,因为它直接达到了我的要求。对于VLAZ和装饰师模式的想法,如果我以后再遇到这样的用例,我一定会考虑这个问题。
function createAccessors(o, path, properties) {
  for (const p of properties)
    Object.defineProperty(o, p, {
      get() { return path(this)[p]; },
      set(v) { path(this)[p] = v; },
    });
}

class Bar {
  constructor(y, z) {
    this.y = y;
    this.z = z;
  }
}

class Foo {
  constructor(x, y, z) {
    this.x = x;
    this.bar = new Bar(y, z);
  }
}
createAccessors(Foo.prototype, foo => foo.bar, ["y", "z"]);

const foo = new Foo(1, 2, 3);
console.log(foo.x, foo.y, foo.z);