javascript - 编写自定义 .on()/.bind() JavaScript 的最高效方式

标签 javascript performance events prototypal

我写了很多小库和模块,通常这些库和模块有一些与之相关的事件。直到现在我一直在写这些(缩短了很多):

Library.prototype.on = function(event, callback){
  self = this;
  self.events[event] = callback;
}

然后用户会做一些事情,例如:

Library.on('foo',function(){
  console.log('bar');
});

是否有更好、更高效的方法来执行此操作,或者这是实现此操作的标准方法?我想要一个简单的 API,我可以将其放入任何 JS 项目中以支持此行为。

最佳答案

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 这样的事件库

关于javascript - 编写自定义 .on()/.bind() JavaScript 的最高效方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8495966/

相关文章:

javascript - 如何通过选择选项来自动激活特定的选择/列表菜单?

javascript - 在 ng-repeat 中使用选择值

javascript - 仅当用户接受 cookie 政策时,Google 跟踪代码管理器才会触发代码

javascript - Dart 中 Object.assign 的等价物是什么?

C代码循环性能

c# - 使用命名空间与从命名空间显式调用类之间是否存在性能差异?

c++ - 事件可以跨进程吗?

performance - Perl 应用程序是否有类似 "New Relic"的内容?

c# - 发布后事件

java - JButton 上的 itemStateChanged