Реализуйте класс 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(...)).