實現一個EventEmitter類,這個類包含以下方法: on(監聽事件,該事件可以被觸發多次)- once(也是監聽事件,但只能被觸發一次)- fire(觸發指定的事件)- off(移除指定事件的某個回調方法或者所有回調方法)
function EventEmitter() {
this.handlers = {}
}
//監聽事件,該事件可以被觸發多次
EventEmitter.prototype.on = function (eventName, handle) {
if (!this.handlers.hasOwnProperty(eventName)) {
this.handlers[eventName] = []
}
this.handlers[eventName].push(handle)
}
//也是監聽事件,但只能被觸發一次
EventEmitter.prototype.once = function (eventName, handle) {
}
//觸發指定的事件
EventEmitter.prototype.fire = function (eventName, ...params) {
if (!this.handlers.hasOwnProperty(eventName)) return
//事件隊列依次執行
this.handlers[eventName].map(handle => {
handle(...params)
})
}
//移除指定事件的某個回調方法或者所有回調方法
EventEmitter.prototype.off = function (eventName, handle) {
if (!this.handlers.hasOwnProperty(eventName)) return
//獲取下標,並刪除
let index = this.handlers[eventName].indexOf(handle)
this.handlers[eventName].splice(index, 1)
}
const emitter = new EventEmitter();
emitter.on('drink', (person) => {
console.log(person + '喝水')
})
emitter.on('eat', (person) => {
console.log(person + '吃東西')
})
// event.once('buy', (person) => {
// console.log(person + '買東西')
// })
emitter.fire('drink', '我') // 我喝水
emitter.fire('drink', '我') // 我喝水
emitter.fire('eat', '其它人') // 其它人吃東西
emitter.fire('eat', '其它人') // 其它人吃東西
emitter.fire('buy', '其它人') //其它人買東西
emitter.fire('buy', '其它人') //這里不會再次觸發buy事件,因為once只能觸發一次
emitter.off('eat') //移除eat事件
emitter.fire('eat', '其它人') //這里不會觸發eat事件,因為已經移除了
