Самый эффективный способ написания пользовательских.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

Я надеюсь, что эти источники помогут вам в ваших поисках.

Другие вопросы по тегам