nodejs事件模块EventEmitter实现原理

function EventEmitter(){
  this._events = Object.create(null);
}

EventEmitter.prototype.on = function(eventName, callback){
  if(!this._events){
    this._events = Object.create(null);
  }
  if(eventName !== 'newListener'){
    this.emit('newListener', callback);
  }
  if(this._events[eventName]){
    this._events[eventName].push(callback);
  }else{
    this._events[eventName] = [callback];
  }
}

EventEmitter.prototype.once = function(eventName, callback){
  let one = ()=>{
    callback();
    this.off(eventName, one);
  }
  one.l = callback;
  this.on(eventName, one);
}

EventEmitter,prototype.off = function(eventName,callback){
  if(this._events[eventName]){
    this._events[eventName].filter(fn=>{
      return fn != callback && fn.l != callback;
    })
  }
}

EventEmitter.prototype.emit = function(eventName, ...args){
  if(this._events[eventName]){
    this._events[eventName].forEach(fn => fn(...args));
  }
}

module.exports = EventEmitter;
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • http://www.liaoxuefeng.com/wiki/001434446689867b27157e896...
    lmem阅读 558评论 1 0
  • 模块的工作原理 实现“模块”功能的奥妙就在于JavaScript是一种函数式编程语言,它支持闭包。如果我们把一段J...
    SwiftBirds阅读 626评论 0 0
  • 常用事件模块 由于本人也是才开始学习Node,所以这里只简单的讲点Scott老师来视频中讲解的事件,后续在进行总结...
    coderLfy阅读 135评论 0 0
  • 去面试一个只有6人的公司,原本只是去长长经验的,没想到面试后居然有些好感。说是三天后给面试结果,我想应该是没戏了...
    燕尤心阅读 129评论 0 0