不要在 ES6 中调用继承的方法两次 类

Don't invoke inherited method twice in ES6 classes

我正在从 RequireJS 转向 browserify(与 babelify 一起)并尝试将我当前的模块重写为 classes。对于我的每个 RequireJS 模块,我都有一个名为 eventHandler 的方法来处理所有模块特定事件。现在,当我扩展 class 时,父 class 调用子 class 的 eventHandler 方法,这导致调用该方法两次。

父级 class:

'use strict';

class Tooltip {
    constructor() {
        this.eventHandler();
    }

    eventHandler() {
        // Module specific events
    }
}

module.exports = Tooltip;

子class:

'use strict';

import Tooltip  from './Tooltip';

class Block extends Tooltip {
    constructor() {
        super();
        this.eventHandler();
    }

    eventHandler() {
        // Module specific events
        // Gets called twice
    }
}

module.exports = Block;

我喜欢 eventHandler 方法在所有模块中的命名都相同,因为它更易于维护。这就是为什么我想保留这种模式。那么解决这个问题的最佳方法是什么?感谢您的任何建议!

因为你知道父构造函数调用 this.eventHandler,所以不要在派生的 类:

中这样做
'use strict';

import Tooltip  from './Tooltip';

class Block extends Tooltip {
    constructor() {
        super();
        // (No call here)
    }

    eventHandler() {
        // Module specific events
        // Gets called twice
    }
}

module.exports = Block;

回复您的评论:

The parent classes don't always implement an eventHandler method. So I need to ensure it gets called in this case as well.

他们在哪里,不打电话。在他们不这样做的地方, 做电话。 Sub类 本质上与 super类 紧密相关。

如果您可以假设 (!) super 中 eventHandler 的存在意味着它已从其构造函数中调用它,您可以这样做:

constructor() {
    super();
    if (!super.eventHandler) {
        this.eventHandler();
    }
}

...但是,super/sub 关系的本质是它的绑定非常紧密,因此依赖于您对 super 是否这样做的了解是合理的。