如何从其子类访问es6超类成员?

时间:2019-11-15 18:51:39

标签: javascript es6-class

所以我正在使用es6类,但是我有些困惑。我的子类需要“阴影” /重写超类方法,但还需要使用超类的成员(实例化的事件发射器)。我应该如何正确地做到这一点? 超类(可以使用Eventemitter3extensionclass,我也需要外部对象才能使用getter):

const eventemitter = new WeakMap(); 
export default class Uicomponentsuperclass {
  constructor() {
    eventemitter.set(this, new Eventemitter3extensionclass());
    // constructor
  }

get eventemitter() {
    return eventemitter.get(this);
  }

  ondosomething() {
    eventemitter.get(this).emit("emittedevent");
  }
// Uicomponentsuperclass
}

子类(显示访问超级事件发射器的尝试失败):

export default class Subclass extends Uicomponentsuperclass {
  constructor() {
    super();
    // constructor
  }

ondosomething() { // shadowed 
    // eventemitter.get(this).emit("emittedevent"); // 
    // eventemitter.get(super).emit("emittedevent"); //  
    // eventemitter.get(super()).emit("emittedevent"); //  
    // super.eventemitter.emit("emittedevent"); //  
  }

3 个答案:

答案 0 :(得分:0)

ondosomething中,您需要引用this并使用您父母中定义的eventemitter吸气剂:

ondosomething() {
    this.eventemitter.emit("emittedevent");
}

this.eventemitter就像属性访问一样,您可以像读取属性一样使用它(即使它背后确实有吸气剂代码)。

这将访问基类定义的eventemitter获取器,它将使您获得所需的Eventemitter3extensionclass对象,然后可以调用.emit()

注意:这还假定ondosomething的调用正确,并且具有正确的值this。如果不是这种情况,那也需要纠正。如果您向我们显示调用代码,我们可以为您提供建议。如果要传递obj.ondosomething作为回调,则可能必须像.bind()中那样使用obj.ondosomething.bind(obj)来确保该方法被正确地绑定到其对象。


仅供参考,我不知道您为什么使用weakMap来存储它们。是否有任何原因导致事件发射器不仅仅存储在基类的实例数据中?看来您已经确保Uicomponentsuperclass对象和相应的Eventemitter3extensionclass对象之间存在一对一的对应关系。

答案 1 :(得分:0)

要从子类中调用Super类方法,请用户super.methodName()

答案 2 :(得分:0)

@Bergi再次正确。天哪,我必须拥有。错误是由另一个子类引发的...我将此归咎于我的过敏;-)。实际上,这可行:

config/routes.js