不要在 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 是否这样做的了解是合理的。
我正在从 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 是否这样做的了解是合理的。