Показать сообщение отдельно
  #5 (permalink)  
Старый 12.07.2017, 19:53
Аватар для EmperioAf
Профессор
Отправить личное сообщение для EmperioAf Посмотреть профиль Найти все сообщения от EmperioAf
 
Регистрация: 15.01.2015
Сообщений: 622

Если вам нужно совсем просто, то:
var obj = {};
var ehs = Symbol('eventHandlersSymbol');
obj.on = function(eventName, handler) {
	this[ehs] = this[ehs] || {};
	var events = this[ehs];
	events[eventName] = events[eventName] || { handlers: [] };
	events[eventName].handlers.push(handler);
}
obj.off = function(eventName, handler) {
	this[ehs][eventName].handlers.splice(handlers.indexOf(handler), 1);
}
obj.trigger = function(eventName) {
	var args = Array.prototype.slice.call(arguments, 1);
	var handlers = this[ehs][eventName].handlers;
	for(var i = 0; i < handlers.length; i++) {
		var handler = handlers[i];
		handler.apply(this, args);
    }
}
obj.on('event', function(val1, val2, val3) {console.log(val1, val2, val3);})
obj.trigger('event', 1, 2, 3, 4, 5);
// 1 2 3

А вообще, конечно, для такого есть библиотеки, например EventEmitter (для браузера). И ты свой объект просто "наследуешь" от объекта EventEmitter и на прототипе объекта появляются все нужные тебе методы, с нужным поведением.
Ответить с цитированием