我正在从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方法在所有模块中都被命名为相同,因为它更容易维护。这就是为什么我要保持这种模式。那么解决这个问题的最佳方法是什么?谢谢你的任何建议!
答案 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();
}
}
...但同样,超/子关系的本质是它非常紧密,所以依靠你对超级是否这样做的了解是合理的。