Как правильно установить и удалить обработчики событий в экземпляре класса (ES6)?

Некий условный плагин, который инициализируется для какого-то элемента, вешает на него обработчики события и имеет возможность самовыпилиться, убрав эти обработчики.

В обработчике события нужен доступ к этому объекту (this).

Вот минимальный пример кода:
class Foo {
  constructor(elem) {
    this.elem = elem;

    this._runEvent = (event) => {
      this._eventHandler(event);
    };

    this._bindEvents();
  }

  destroy() {
    this._unbindEvents();
  }

  _bindEvents() {
    this.elem.addEventListener('click', this._runEvent);
  }

  _unbindEvents() {
    this.elem.removeEventListener('click', this._runEvent);
  }

  _eventHandler(event) {
    console.log(this);
  }
}


Получается, что я для каждого нового экземпляра этого класса создаю метод _runEvent, который просто вызывает метод из прототипа. Но благодаря этому я могу этот метод как ставить обработчиком события, так и убирать.
Если бы не требовался метод _unbindEvents, то сразу бы ставилась например стрелочная функция, вызывающая _eventHandler.

Собственно вопрос - нет ли более правильной альтернативы?
  • Вопрос задан
  • 471 просмотр
Пригласить эксперта
Ответы на вопрос 1
alexey-m-ukolov
@alexey-m-ukolov Куратор тега JavaScript
Если я правильно понял вашу проблему, то нужно просто в конструкторе прибить гвоздями контекст к нужным методам:
this._bindEvents = this._bindEvents.bind(this);
this._unbindEvents= this._unbindEvents.bind(this);
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы