class Emmiter{
constructor(){
this.eventList = {}
}
on(type,func){
if(!this.eventList[type]){
this.eventList[type] = []
}
this.eventList[type].push(func)
}
emit(type,val){
if(!this.eventList[type]) return
this.eventList[type].forEach(fn=>fn.call(this,val))
}
off(type,func){
if(!this.eventList[type]) return
this.eventList[type].some((item,index,arr)=>{
if(item===func){
arr.splice(index,1)
return true
}
})
}
}
const emmiter = new Emmiter()
let print = (res) => { console.log(res) }
emmiter.on('a', print)
emmiter.emit('a', '我是中国人')
emmiter.emit('a', '我说普通话')
emmiter.off('a',print)
emmiter.emit('a', '我是中国人')
emmiter.emit('a', '我说普通话')
升级版
class eventEmmiter{
constructor(){
this.events = new Map()
this.wrapCallback = (fn,once=false) => ({callback:fn,once})
}
addListenter(type,func,once=false){
const handler = this.events.get(type)
if(!handler){
this.events.set(type,this.wrapCallback(func,once))
}else if(!Array.isArray(handler)){
this.events.set(type,[handler,this.wrapCallback(func,once)])
}else{
handler.push(this.wrapCallback(func,once))
}
}
removeListener(type,listener){
const handler = this.events.get(type)
if(!handler) return
if(!Array.isArray(handler)){
if(handlder.callback === listener.callback){
this.events.delete(type)
}else{
return true
}
}else{
for(let i = 0 ; i < handler.length;i++){
const item = handeler[i].callback
if(item === listener.callback){
handler.splice(i,1)
i--
if(handler.length===1){
this.events.set(type,handler[0])
}
}
}
}
}
removeAllListener(type){
const handler = this.events.get(type)
if(!handler) return
this.events.delete(type)
}
once(type,func){
this.addListener(type,func,true)
}
emit(type,...args){
const handler = this.events.get(type)
if(!handler) return
if(!Array.isArray(handler)){
handler.callback.apply(this,args)
if(handler.once) this.removeListener(type,handler)
}else{
handler.map(item=>{
item.callback.apply(type,args)
if(item.once) this.removeListener(type,item)
})
}
}
}