首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >无法在JavaScript中调用父类方法

无法在JavaScript中调用父类方法
EN

Stack Overflow用户
提问于 2018-10-14 17:31:49
回答 1查看 51关注 0票数 0

我正在尝试实现一个EventEmitter类,它将用于在MVC组件之间发出事件。我对JavaScripts的MVC模式还很陌生。

EventEmitter.js

代码语言:javascript
复制
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发出事件的方式

代码语言:javascript
复制
import EventEmitter from "../EventEmitter.js";
export default class ModelClass extends EventEmitter {
    constructor(options) {
        super();
        super.emit('test', options);
    }

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-14 17:34:27

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

几个附注,FWIW:

  • 通常你只需要使用this.emit(),即使emit是由父类定义的。没有必要使用super.emit(),除非您特别想绕过在当前级别定义的emit (您并没有定义它,所以...)。
  • 通常最好不要从构造函数调用方法(因为子类可以覆盖那些方法,但是还没有机会完成它们的初始化),当然也不要让构造函数执行像发出事件这样的操作。
  • 您可能还想从EventEmitter中删除emit (或将其保留为静态),而让ModelClass调用一些内部发射器(或EventEmitter.emit)。否则,将emit设置为ModelClass的公共方法,这意味着它的任何使用者都可以从中发出事件,这可能并不理想。

再说一次,就是FWIW。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52801307

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档