我正在尝试实现一个EventEmitter类,它将用于在MVC组件之间发出事件。我对JavaScripts的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);
}
请注意,我不想像上面那样调用emit函数,我在要发出事件的类中有不同的方法,但为了更容易理解,我把它放在这里,因为它甚至不能在构造函数中工作。
发布于 2018-10-14 17:34:27
您的方法是static
,所以它们在EventEmitter
上,而不是它的实例上。从on
和emit
中删除static
。
几个附注,FWIW:
this.emit()
,即使emit
是由父类定义的。没有必要使用super.emit()
,除非您特别想绕过在当前级别定义的emit
(您并没有定义它,所以...)。EventEmitter
中删除emit
(或将其保留为静态),而让ModelClass
调用一些内部发射器(或EventEmitter.emit
)。否则,将emit
设置为ModelClass
的公共方法,这意味着它的任何使用者都可以从中发出事件,这可能并不理想。再说一次,就是FWIW。
https://stackoverflow.com/questions/52801307
复制相似问题