我的回答
class Observer {
constructor() {
this.ob = {}
}
depend(key, cb) {
if (!this.ob[key]) {
this.ob[key] = []
}
this.ob[key].push(cb)
}
notify(key) {
this.ob[key] && this.ob[key].forEach(cb => cb())
}
}
参考回答
class EventEmitter {
constructor() {
// 存放订阅的名称和事件
this.events = {};
}
// 订阅事件的方法
on(eventName, callback) {
if(this.events[eventName]) {
// 事件是否存在,存在则追加一条订阅事件
this.events[eventName].push(callback);
} else {
// 不存在,新增一条事件数组
this.events[eventName] = [callback];
}
}
// 出发订阅的方法
emit(eventName) {
// 遍历执行所有订阅的事件
this.events[eventName] && this.events[eventName].forEach((cb) => cb());
}
// 移除订阅事件
removeListener(eventName, callback) {
if(this.events[eventName]) {
this.events[eventName] = this.events[eventName].filter((cb) => cb !== callback);
}
}
// 只执行一次订阅的事件,然后移除
once(eventName, callback) {
const fn = () => {
callback();
this.removeListener(eventName, fn);
};
this.on(eventName, fn);
}
}
const callback1 = () => {
console.log('callback1');
};
let eventEmitter = new EventEmitter();
eventEmitter.on('click', () => {console.log('click');});
eventEmitter.on('click', callback1);
eventEmitter.emit('click');
eventEmitter.removeListener('click', callback1);
eventEmitter.emit('click');
eventEmitter.once('once-click', () => {console.log('once-click');});
eventEmitter.emit('once-click');
eventEmitter.emit('once-click');