想象一下,我在层次结构中连接了3个类ChildParentGrandparent,如下所示:

class Grandparent {
  set myField(value) {
    console.log('Grandparent setter');
  }
}

class Parent extends Grandparent {
  set myField(value) {
    console.log('Parent setter');
  }
}

class Child extends Parent {
  set myField(value) {
    //I know how to call Parent's setter of myField:
    //super.myField = value;
    //But how to call Grandparent's setter of myField here?
  }
}

如何在Grandparent类的setter中调用myFieldChild的setter?

我特别对二传手而不是方法感兴趣。另外,最好不要更改Parent类的Grandparent

我看不到使用super怎么可能,因为它只引用Parent类,以及使用类似Grandparent.prototype.<what?>.call(this, ...)的东西,因为我不知道原型(prototype)中到底要调用什么。

有人对此案有任何建议吗?

提前致谢!

最佳答案



您在正确的轨道上,可以使用 Object.getOwnPropertyDescriptor 访问setter方法:

Object.getOwnPropertyDescriptor(Grandparent.prototype, "myField").set.call(this, value);

不过,还有一种更简单的方法:将 Reflect.set helper与自定义接收器一起使用:
Reflect.set(Grandparent.prototype, "myField", value, this);

这还有一个优点,当Grandparent没有定义 setter 时,它仍然可以工作。

就是说,我同意@Dinu的观点,当您需要这样做时,您的类层次结构(或您的一般设计,也许甚至不应该使用类或继承)可能存在问题。

08-06 15:17