以下为ChatGPT自动生成的解答,正确与否请自行判断。 也许你也可以从大家的发帖中找到想要的答案!
BFE.devAI解答 - JavaScript 代码题
16. 实现一个Event Emitter
实现一个简单的Event Emitter可以使用JavaScript的类来实现,利用对象的属性和方法来存储事件和对应的回调函数。
以下是可能的实现:
class Emitter { constructor() { this.events = {} } subscribe(eventName, callback) { // 如果该事件还没有任何订阅者,则新建一个数组 if (!this.events[eventName]) { this.events[eventName] = [] } // 将callback添加到事件的回调函数数组中 this.events[eventName].push(callback) // 返回一个带有release方法的对象,用于取消订阅 return { release: () => { const index = this.events[eventName].indexOf(callback) this.events[eventName].splice(index, 1) } } } emit(eventName, ...args) { // 如果该事件存在,则遍历所有的回调函数并执行它们 if (this.events[eventName]) { this.events[eventName].forEach(callback => callback(...args)) } }}
这样我们就可以使用这个Event Emitter了:
const emitter = new Emitter()const sub1 = emitter.subscribe('event1', (a, b) => { console.log(`callback1 called with ${a} and ${b}`)})const sub2 = emitter.subscribe('event2', () => { console.log('callback2 called')})emitter.emit('event1', 1, 2)// 输出: callback1 called with 1 and 2sub1.release()emitter.emit('event1', 3, 4)// 没有输出emitter.emit('event2')// 输出: callback2 calledsub2.release()emitter.emit('event2')// 没有输出