我正在尝试实现EventEmitter类,该类将用于在MVC组件之间发出事件。我对JavaScript的MVC模式非常陌生。
EventEmitter.js
export default class EventEmitter {
constructor() {
this._events = {};
}
static on(event, listener) {
(this._events[event] || (this._events[event] = [])).push(listener);
return this;
}
static emit(event, args) {
(this._events[event] || []).slice().forEach(listener => listener(args));
}
}
但是,无论我在哪里尝试发出一些事件,它都不会正常工作,因为我收到一条错误消息:
TypeError :(中间值).emit不是函数
这就是我想从ModelClass.js发出事件的方式:
import EventEmitter from "../EventEmitter.js";
export default class ModelClass extends EventEmitter {
constructor(options) {
super();
super.emit('test', options);
}
请注意,我不想像上面的例子那样调用调用函数,在类中我想发送事件的方法不同,但是为了便于理解,我将其放在此处,因为它甚至在构造函数中也不起作用。
最佳答案
您的方法是static
,因此它们位于EventEmitter
上,而不是其实例上。从static
和on
中删除emit
。
FWIW的一些注意事项:
通常,即使父类定义了this.emit()
,也只会使用emit
。除非您特别想绕过当前级别定义的super.emit()
(不需要定义一个,所以...),否则不需要emit
。
通常最好不要从构造函数中调用方法(因为子类可以覆盖这些方法,但是还没有机会完成其初始化),当然也不要让构造函数执行类似发出事件的操作。只是FWIW。
您可能还想从emit
中删除EventEmitter
(或使其保持静态),而是让ModelClass
调用某些内部发射器(或EventEmitter.emit
)。否则,将emit
设为ModelClass
的公共方法,这意味着它的任何使用者都可以从中发出事件,这可能不是理想的。
同样,只是FWIW。
关于javascript - 无法在JavaScript中调用父类方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52801307/