【问题标题】:Cannot call parent class methods in JavaScript无法在 JavaScript 中调用父类方法
【发布时间】:2018-10-14 09:31:49
【问题描述】:

我正在尝试实现一个 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);
    }

请注意,我不想像上述情况那样调用发出函数,我在类中有不同的方法,我想发出我的事件,但为了更容易理解,我把它放在这里,因为它甚至不起作用在构造函数中。

【问题讨论】:

  • 你把emit设为static,这可能是问题所在——为什么不使用标准方法?
  • 哦!这可能是它!我把 static 放在那里是因为我正在调试发射器的最初问题,但不知何故,我可能修复了最初的问题,但“静态”关键字仍然存在..

标签: javascript events model-view-controller


【解决方案1】:

你的方法是static,所以它们在EventEmitter,而不是它的实例。从onemit 中删除static


一些旁注,FWIW:

  • 通常您只使用this.emit(),即使emit 是由父类定义的。不需要super.emit(),除非您特别想绕过在当前级别定义的emit(您没有定义一个,所以...)。

  • 通常最好不要从构造函数调用方法(因为子类可以覆盖这些方法,但还没有机会完成它们的初始化),当然也不要让构造函数执行类似的操作发出事件。只是 FWIW。

  • 您可能还想从EventEmitter 中删除emit(或保持静态),而是让ModelClass 调用某个内部发射器(或EventEmitter.emit)。否则,您将emit 设为ModelClass 的公共方法,这意味着它的任何consumer 都可以从中发出事件,这可能并不理想。

再次,只是 FWIW。

【讨论】:

  • T.J.是的,这就是问题所在。我之前的事件发射器有其他问题,我放了静态只是为了尝试修复它。但是在此过程中,我解决了最初的问题,但忘记从发射器中删除静态... 6 小时连续编码的结果.. :/ 谢谢!一旦允许我就会接受。
猜你喜欢
  • 2018-01-27
  • 2012-09-25
  • 1970-01-01
  • 1970-01-01
  • 2020-12-27
  • 1970-01-01
  • 2016-02-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多