JavaScript实现自定义Event(omit,once,addEventListener)

24 篇文章 0 订阅

自定义实现JavaScript中的事件函数,包括AddListener,RemoveListener,Once,Emit等方法

function EventEmitter(){
  this.events = new Map();
}

// 实现方法

// addEventListener
const wrapCallback = (fn,once=false)=>({callback:fn,once});
EventEmitter.prototype.addListener = function(type,fn,once=false){
  const handler = this.events.get(type);
  if(!handler){
    // 没有type绑定事件
    this.events.set(type,wrapCallback(fn,once));
  }else if(handler && typeof handler.callback === 'function'){
    //目前type事件只有一个
    this.events.set(type,[handler,wrapCallback(fn,once)]);
  }else{
    // type事件》=2
    handler.push(wrapCallback(fn,once));
  }
}
//模拟实现removeListener
EventEmitter.prototype.removeListener = function(type,listener){
  const handler = this.events.get(type);
  if(!handler)return;
  if(!Array.isArray(this.events)){
    if(handler.callback === listener.callback) this.events.delete(type);
    else return;
  }
  for(let i = 0;i<handler.length;i++){
    const item = handler[i];
    if(item.callback === listener.callback){
      handler.splice(i,1);
      i--;
      if(handler.length===1){
        this.events.set(type,handler[0]);
      }
    }
  }
}
// 模拟实现once方法
EventEmitter.prototype.once = function(type,listener){
  this.addListener(type,listener,true);
}
// 模拟实现emit方法
EventEmitter.prototype.emit = function(type,...args){
  const handler = this.events.get(type);
  if(!handler)return;
  if(Array.isArray(handler)){
    handler.forEach(item=>{
      item.callback.apply(this,args);
      if(item.once){
        this.removeListener(type,item);
      }
    })
  }else{
    handler.callback.apply(this,args);
    if(handler.once){
      this.events.delete(type);
    }
  }
  return true;
}

EventEmitter.prototype.removeAllListener = function(type){
  const handler = this.events.get(type);
  if(!handler)return;
  this.events.delete(type);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值