class EventEmitter {
constructor() {
this.listeners = Object.create(null)
}
on = (event, listener) => {
if (!event || !listener) {
return
}
if (!this.listeners[event]) {
this.listeners[event] = []
}
this.listeners[event].push(listener)
}
emit = (event, ...args) => {
if (!this.hasBind(event)) {
return
}
this.listeners[event].forEach(item => {
item.call(this, ...args)
})
}
off = (event, listener) => {
if (!this.hasBind(event)) {
return
}
if(!listener) {
delete this.listeners[event]
return
}
this.listeners[event] = this.listeners[event].filter(item => item !== listener)
}
once = (event, listener) => {
function one() {
listener.call(this, arguments)
this.off(event, listener)
}
this.on(event, one)
}
hasBind = event => {
return this.listeners[event] && this.listeners[event].length
}
}
const baseEvent = new EventEmitter()
function cb(value){
console.log("hello "+ value)
}
function cb1(value){
console.log("hello1 "+ value)
}
function cb2(value){
console.log("hello2 "+ value)
}
function cb3(value){
console.log("hello3 "+ value)
}
baseEvent.on("click",cb)
baseEvent.on("click",cb1)
baseEvent.on("click",cb2)
baseEvent.on("click",cb3 )
baseEvent.emit("click",'2020')
baseEvent.off("click",cb1)
baseEvent.emit("click",'2020')