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