以下为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')
// 没有输出