Невозможно вызвать методы родительского класса в JavaScript - PullRequest
0 голосов
/ 14 октября 2018

Я пытаюсь реализовать класс EventEmitter, который будет использоваться для передачи событий между компонентами MVC.Я довольно новичок в шаблоне MVC JavaScripts.

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, как в предыдущем случае, у меня есть разные методы внутри класса, где я хочу генерировать свои события, но для упрощенияПонимаю, я это здесь изложил, потому что в конструкторе он даже не работает.

1 Ответ

0 голосов
/ 14 октября 2018

Ваши методы static, поэтому они на EventEmitter, а не экземплярах .Удалите static из on и emit.


Несколько примечаний, FWIW:

  • Обычно вы просто используете this.emit(), даже если emit определен родительским классом.super.emit() не требуется, если только вы специально не хотите обойти emit, определенный на текущем уровне (вы не определяете его, так что ...).

  • Как правило, лучшене вызывать методы из конструктора (потому что подклассы могут переопределять эти методы, но у них еще не будет возможности завершить их инициализацию), и, конечно же, не заставлять конструктор выполнять действие, подобное генерации события.Просто FWIW.

  • Вы также можете удалить emit из EventEmitter (или оставить его статичным) и вместо этого ModelClass вызвать некоторый внутренний эмиттер (или EventEmitter.emit).).В противном случае вы делаете emit открытым методом ModelClass, что означает, что любой потребитель из него может генерировать из него события, что, вероятно, не идеально.

Опять же, просто FWIW.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...