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

时间:2015-11-29 10:27:20

标签: javascript requirejs ecmascript-6 browserify

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

家长班:

'use strict';

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

    eventHandler() {
        // Module specific events
    }
}

module.exports = Tooltip;

子类:

'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方法在所有模块中都被命名为相同,因为它更容易维护。这就是为什么我要保持这种模式。那么解决这个问题的最佳方法是什么?谢谢你的任何建议!

1 个答案:

答案 0 :(得分:1)

由于您知道父构造函数调用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;

重新评论:

  

父类并不总是实现eventHandler方法。所以我需要确保在这种情况下调用它。

他们在哪里,不要打电话。如果他们不这样做,进行通话。根据其性质,子类与超类紧密绑定。

如果您可以假设(!)超级中eventHandler的存在意味着它已从其构造函数中调用它,您可以执行以下操作:

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

...但同样,超/子关系的本质是它非常紧密,所以依靠你对超级是否这样做的了解是合理的。