Эмиттер событий (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
Результаты
Нажмите «Запуск» для выполнения кода