Эмиттер событий (EventEmitter)

Medium
ClassPatternSber

Реализуйте класс EventEmitter с методами:

  • on(event, handler) - подписаться на событие
  • off(event, handler) - отписаться
  • emit(event, ...args) - вызвать все обработчики события с аргументами
  • once(event, handler) - подписаться на одно срабатывание
const ee = new EventEmitter();
ee.on('click', (x) => console.log(x));
ee.emit('click', 42); // => 42
Подсказка

Храните обработчики в объекте this.events = {}. on - добавить в массив по ключу события. off - отфильтровать по ссылке функции (h !== handler). emit - пробежаться по массиву.

Подсказка

once - создайте wrapper, который вызывает handler, а потом делает this.off(event, wrapper). Важно: в off передавайте именно wrapper, а не handler.

Подсказка

Что ещё могут спросить: добавить поддержку onAny - глобального обработчика для всех событий. Или сделать методы возвращающими this для цепочек вызовов (ee.on(...).on(...)).

Ваш код - JavaScript
Результаты
Нажмите «Запуск» для выполнения кода