参照vue源码$ on和$ emit的实现
class Bus {
constructor() {
this.bus = Object.create(null)
}
// on('xxx',cb)
// this.bus = {
// 'xxx': fn
// }
on(event,fn) {
if(Array.isArray(event)) {
for(let i =0, len = event.length; i < len; i ++) {
this.on(event[i],fn)
}
}else {
(this.bus[event] || (this.bus[event] = [])).push(fn)
}
}
// 用arguments做
emit(event) {
let cbs = this.bus[event]
if(cbs) {
cbs = cbs.length > 1 ? Array.from(cbs) : cbs
const args = Array.from(arguments).slice(1)
console.log(args,'args')
for(let i =0 ; i < cbs.length; i ++) {
try {
cbs[i].apply(this,args)
} catch (error) {
console.log(error)
}
}
}
}
}
const bus = new Bus()
bus.on('xxxx',(e) => {
console.log('xxxx',e)
})
bus.emit('xxxx','2333')
// 执行结果
// [ '2333' ] args
// xxxx 2333
后续有时间会加上once 和 off