以下为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 2
sub1.release()
emitter.emit('event1', 3, 4)
// 没有输出
emitter.emit('event2')
// 输出: callback2 called
sub2.release()
emitter.emit('event2')
// 没有输出