По теме 1.
Замени push на равно. Объяснить не могу, но это сработает. Не думаю, что тебе на 1 обработчик потребуется несколько функций. Возможно балуется сборщик мусора, так как в отладке функцию в массив складывает.
this.events[event] = callback
По теме 2.
Можно позаимсововать код EventEmmiter для node.js
Про велосипедность, да пахнет велосипедом. На мой взгляд избыточным смотрится наследование с передачей опций вникуда, а еще отдельный метод для регистрации события. Этот функционал должен быть включен в on. Так же неплохо иметь методы просмотра списка событий и удаление.
А еще не совсем понимаю, как ты передашь в функцию параметры, которая попала в on. Посмотри в ноде доки, там параметры передаются после функции как аргументы.
Апдейт, нарисовал чуток кода. Возможно это вам нужно.
class Emitter {
constructor() {
this.events = {};
}
on(event, cb) {
console.log('[ON]Проверяем есть ли массив функций: ' + (this.events[event] instanceof Array));
if (!(this.events[event] instanceof Array)) {
console.log('[ON]Создаем массив для ' + event);
this.events[event] = [];
}
this.events[event].push(cb);
console.log('[ON]В событие: ' + event + ' добавлена функция: ' + cb);
}
emit(event, arg) {
try {
if (!this.events.hasOwnProperty(event))
throw Error('Попытка вызвать незарегистрированное событие');
console.log('[EMIT]Проверяем в эмите ' + (this.events[event] instanceof Array));
this.events[event].forEach(function (item) {
console.log('[EMIT]Выполняем событие: ' + item + ' для аргумента: ' + arg);
item(arg);
});
} catch (e) {
console.log('Отловили ошибку: ' + e.message);
}
}
}
let fu1 = function (arg) {
console.log('[FUNCTION]Выполняется первая функция из эмиттера, значение аргумента ' + arg);
};
let fu2 = function (arg) {
console.log('[FUNCTION]Выполняется вторая функция из эмиттера, значение аргумента ' + arg);
};
let obj1 = new Emitter();
obj1.on('run', fu1);
obj1.on('run', fu2);
obj1.emit('run', 'hellooooo!!!');
obj1.emit('run', 'hef3efgw2llooooo!!!');
obj1.emit('rune', 'hef3efgw2llooooo!!!');
Результат исполнения:
[ON]Проверяем есть ли массив функций: false
[ON]Создаем массив для run
[ON]В событие: run добавлена функция: function (arg) {
console.log('[FUNCTION]Выполняется первая функция из эмиттера, значение аргумента ' + arg);
}
[ON]Проверяем есть ли массив функций: true
[ON]В событие: run добавлена функция: function (arg) {
console.log('[FUNCTION]Выполняется вторая функция из эмиттера, значение аргумента ' + arg);
}
[EMIT]Проверяем в эмите true
[EMIT]Выполняем событие: function (arg) {
console.log('[FUNCTION]Выполняется первая функция из эмиттера, значение аргумента ' + arg);
} для аргумента: hellooooo!!!
[FUNCTION]Выполняется первая функция из эмиттера, значение аргумента hellooooo!!!
[EMIT]Выполняем событие: function (arg) {
console.log('[FUNCTION]Выполняется вторая функция из эмиттера, значение аргумента ' + arg);
} для аргумента: hellooooo!!!
[FUNCTION]Выполняется вторая функция из эмиттера, значение аргумента hellooooo!!!
[EMIT]Проверяем в эмите true
[EMIT]Выполняем событие: function (arg) {
console.log('[FUNCTION]Выполняется первая функция из эмиттера, значение аргумента ' + arg);
} для аргумента: hef3efgw2llooooo!!!
[FUNCTION]Выполняется первая функция из эмиттера, значение аргумента hef3efgw2llooooo!!!
[EMIT]Выполняем событие: function (arg) {
console.log('[FUNCTION]Выполняется вторая функция из эмиттера, значение аргумента ' + arg);
} для аргумента: hef3efgw2llooooo!!!
[FUNCTION]Выполняется вторая функция из эмиттера, значение аргумента hef3efgw2llooooo!!!
Отловили ошибку: Попытка вызвать незарегистрированное событие