执行子类方法后执行代码

时间:2018-03-08 17:49:21

标签: javascript

给出两个类,如:

class A {
  method() {
    this.fn1();
  }

  fn1() {}
  fn2() {}
  fn3() {}
}

class B extends A {
  method() {
    super.method();

    this.fn2();
  }

  fn1() {}
  fn2() {}
}

我希望能够从超类中调用fn1,从子类调用fn2,然后从超类中调用fn3一次。更具体地说,我想触发一个"事件"完全执行调用树后一次

此问题与从超级构造函数调用实例方法的问题有关。我需要打电话给跟进'底部子类完成后的方法。

有关如何执行此操作的一些想法:

    来自super的
  • setTimeoutdebounce(因为这需要同步而无法正常工作)
  • 总是从子类调用方法(当子类被扩展时不起作用)
  • 将函数引用传递给fn3以尝试确定它是否是树中的最后一个函数
  • 以某种方式从超类
  • 修改子类的原型方法

这最后一个选项似乎最有希望,但我需要一些方向。

我该如何做到这一点?

1 个答案:

答案 0 :(得分:0)

我相信我已经想出了一个解决方案,但它可能不是最理想的,我不肯定它能正确保留上下文:

https://jsfiddle.net/b6zqw19a/30/

class After {
  constructor(props) {
    if (this.construct) {
      if (this.afterConstruct) {
        this.after({
          construct: () => this.afterConstruct(),
        });
      }

      this.construct(props);
    }
  }

  after(fns) {
    Object.entries(fns).forEach(entry => {
      var key = entry[0];
      var call = entry[1];
      var fn = this[key];

      this[key] = (function(...args) {
        fn.bind(this)(...args);
        call.bind(this)();
      }).bind(this);
    });
  }
}