我正在尝试实现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上,而不是其实例上。从staticon中删除​​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/

10-13 00:46