class EventEmitter {
constructor() {
this.events = {}
}
// 添加订阅
on(type, callback) {
if (!this.events[type]) {
this.events[type] = []
}
this.events[type].push(callback)
}
// 触发事件
emit(type, ...rest) {
if (!this.events[type]) throw new Error('event does not exist')
console.log(this.events[type])
this.events[type].forEach((fn) => fn.apply(this, rest))
}
// 移除订阅
off(type, callback) {
if (!this.events[type]) throw new Error('event dose not exist')
this.events[type] = this.events[type].filter((item) => item !== callback)
}
// 只触发一次事件,之后销毁
once(type, callback) {
const fn = () => {
this.off(type, fn)
callback(...arguments)
}
this.on(type, fn)
}
}
const myEvent = new EventEmitter()
myEvent.on('click', (res) => {
console.log('监听click事件', res)
})
myEvent.once('click',function(){
console.log('click2')
})
myEvent.emit('click', 'click data')
【js】手写封装简易版监听器
最新推荐文章于 2024-05-12 11:12:55 发布