Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
编写自定义.on()/.bind()JavaScript最有效的方法_Javascript_Performance_Events_Prototypal - Fatal编程技术网

编写自定义.on()/.bind()JavaScript最有效的方法

编写自定义.on()/.bind()JavaScript最有效的方法,javascript,performance,events,prototypal,Javascript,Performance,Events,Prototypal,我写了很多小的库和模块,通常这些库和模块都有一些与之相关的事件。到目前为止,我一直在写这些(缩短了很多): 然后用户将执行以下操作: Library.on('foo',function(){ console.log('bar'); }); 有没有更好更高效的方法来实现这一点,或者这是实现这一点的标准方法?我想要一个简单的API,可以放入任何JS项目来支持这种行为。您正在寻找JavaScript 并为观察者提供了一些不错的实现 但是一个新的nice模式是在 已经实现并正在深入使用promis

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

然后用户将执行以下操作:

Library.on('foo',function(){
  console.log('bar');
});
有没有更好更高效的方法来实现这一点,或者这是实现这一点的标准方法?我想要一个简单的API,可以放入任何JS项目来支持这种行为。

您正在寻找JavaScript

并为观察者提供了一些不错的实现

但是一个新的nice模式是在

已经实现并正在深入使用promise模式

我最喜欢的Promises模式实现是@kriskowal

我希望这些资料能对你的探索有所帮助

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
,当我需要快速而肮脏的自定义事件时使用

我的实现和您的实现之间的唯一区别是,我的实现允许每个事件进行多次回调


对于任何严肃的事情,我都会使用类似

的事件库,唯一奇怪的是removeListener只会删除最后添加的事件。我认为
removeListener('event')
的预期用途可能是人们在jQuery中使用
unbind('event')
删除所有引用的方式(除非添加类似
event.foo的命名空间)@OscarGodson您必须手动删除所有侦听器。调用
RemovelListener(ev)
将删除最后一个侦听器,这完全是巧合。(索引为-1,因此它删除最后一项)。您应该调用
removeListener(ev,handler)
。我添加了一个remove all选项,以便更容易地进行拆卸,它只是设置了这个选项。_events[ev]=[]
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);
        }
    }
};