Самый эффективный способ написания пользовательских.on()/. Bind() JavaScript
Я пишу много маленьких библиотек и модулей, и обычно с этими библиотеками и модулями связаны некоторые события. До сих пор я писал такие (сокращенно):
Library.prototype.on = function(event, callback){
self = this;
self.events[event] = callback;
}
тогда пользователь будет делать что-то вроде:
Library.on('foo',function(){
console.log('bar');
});
Есть ли лучший, более производительный способ сделать это, или это стандартный способ реализации этого? Мне нужен простой API, который я могу добавить в любой проект JS для поддержки этого поведения.
2 ответа
var EventEmitter = {
constructor: function _constructor() {
this._events = [];
return this;
},
on: function _on(ev, handler) {
if (!this._events[ev]) {
this._events[ev] = [];
}
this._events[ev].push(handler);
},
removeListener: function _removeListener(ev, handler) {
if (!this._events[ev]) return;
this._events[ev].splice(this._events[ev].indexOf(handler), 1);
},
removeAll: function _removeAll(ev) {
delete this._events[ev];
},
emit: function _emit(ev, data) {
if (!this._events[ev]) return;
this._events[ev].forEach(invokeHandler);
function invokeHandler(handler) {
handler(data);
}
}
};
У меня есть маленький EventEmitter
Я использую, когда мне нужны быстрые и грязные пользовательские события.
Единственная разница между моей и вашей реализацией состоит в том, что моя допускает несколько обратных вызовов для одного события.
Для чего-то серьезного я использую библиотеку событий, такую как EventEmitter2
Вы ищете Обозреватель Pattern для JavaScript.
У Spine и Backbone есть несколько хороших реализаций для наблюдателей.
Но новый хороший шаблон - это шаблон Обещаний, которые документированы в CommonJS
В jQuery 1.7 реализован и используется шаблон обещаний.
Моя любимая реализация из шаблона Promises - это Q из @kriskowal
Я надеюсь, что эти источники помогут вам в ваших поисках.