如何直接调用对象的父类的设置器?

时间:2019-01-28 14:15:28

标签: javascript inheritance ecmascript-6 getter-setter

TLDR; 如何直接调用对象父类的setter而不调用父类和子类之外的子setter?


我知道,如果存在解决方案,那么它可能会很hacky /类似魔术,但是我不介意。这是场景:

  • Parent是第3方库中的类,所以我根本无法更改此代码。
  • Child是我的代码库中的一个类,但是我想将魔术代码保留在它之外,因为Prop类可以与不同的“ Child”类一起使用。
  • Prop是必要时可以放置魔术代码的类。

我需要通过Parent对象访问x的{​​{1}}的设置器,而无需调用Child的{​​{1}}的设置器。

有可能吗?

x

1 个答案:

答案 0 :(得分:2)

Reflect.set在这里为您提供帮助!它确实允许单独通过接收器:

setX() {
  Reflect.set(Parent.prototype, "x", 0, this.child); // invokes the Parent.protype.x setter
}

替代方案为Object.getOwnPropertyDescriptor(Parent.prototype, "x").set.call(this.child, 0)或仅为this.child._x = 0(如果您不需要运行setter代码)。


因此,在可能的情况下,我建议您重新考虑您的设计。也许继承是错误的方法,您应该使用组合而不是extends Parent

class Child {
  constructor() {
    this.val = new Parent();
  }

  set x(v) {
    … // Shenanigans
    this.val.x = v;
  }

  get x() {
    return this.val.x;
  }

  // (without the Prop helper class for simplicity)
  setX(v) {
    // without shenanigans
    this.val.x = v;
  }
}