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事件,由於已經移除了