面试题答案
一键面试思路
- 定义符号事件类型:使用
Symbol
创建唯一的事件类型标识符,这样可以避免与其他库或代码中的事件类型冲突,增强封装性。 - 事件监听:通过对象的属性来存储事件处理函数,属性名使用
Symbol
。 - 事件触发:遍历存储事件处理函数的对象属性,调用相应的处理函数。
代码示例
// 1. 定义基于符号的事件类型
const EVENT_TYPE = Symbol('eventType');
class EventEmitter {
constructor() {
// 存储事件处理函数的对象
this.eventHandlers = {};
}
// 2. 监听事件
on(eventType, handler) {
if (!this.eventHandlers[eventType]) {
this.eventHandlers[eventType] = [];
}
this.eventHandlers[eventType].push(handler);
}
// 3. 触发事件
emit(eventType, ...args) {
if (this.eventHandlers[eventType]) {
this.eventHandlers[eventType].forEach(handler => handler(...args));
}
}
}
// 使用示例
const emitter = new EventEmitter();
emitter.on(EVENT_TYPE, (message) => {
console.log(`Received event: ${message}`);
});
emitter.emit(EVENT_TYPE, 'Hello, Symbol-based event!');
在上述代码中:
- 首先定义了一个
Symbol
类型的EVENT_TYPE
作为事件类型。 EventEmitter
类包含on
方法用于监听事件,emit
方法用于触发事件。on
方法将事件处理函数存储在eventHandlers
对象中,属性名是Symbol
。emit
方法遍历并调用相应Symbol
类型事件的处理函数。