我的回答
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');