【问题标题】:execute code after subclass method is executed子类方法执行后执行代码
【发布时间】:2018-03-08 17:49:20
【问题描述】:

给定两个类,如下所示:

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 以尝试确定它是否是树中的最后一个函数
  • 以某种方式从超类修改子类的原型方法

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

我怎样才能做到这一点?

【问题讨论】:

    标签: javascript


    【解决方案1】:

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

    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);
        });
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多