// 主题 class Dep { constructor(callback) { this.subs = [] // 主题的订阅者 this.callback = callback // console.log('callback', callback) } // 添加订阅者 addSub(sub) { console.log('sub',sub) this.subs.push(sub) return this } // 主题更新通知---调用订阅者update,通知所有订阅者 notify() { this.subs.forEach(item => { item.update(this.callback) }); } } // 订阅者 class Sub { constructor(val) { this.val = val } update(callback) { // console.log('update', callback) this.val = callback(this.val) console.log('更新之后:', this.val) } } // 发布者 class Pub { constructor() { this.deps = [] // 发布的主题列表 } // 添加主题 addDep(dep) { this.deps.push(dep) } // 移除主题 removeDep(dep) { let index = this.deps.indexOf(dep) if(index !== -1) { this.deps.splice(index, 1) return true } else { return false } } // 更新主题 publish(dep) { this.deps.forEach(item => item == dep && item.notify()); } } // 新建主题, 给主题中加订阅者 let dep1 = new Dep(item => item * item) // console.log(dep1) // dep1.addSub(new Sub(1)).addSub(new Sub(2)).addSub(new Sub(3)) // dep1.addSub(new Sub(1)) console.log(dep1.addSub(new Sub(1))) // 新建发布者 let pub = new Pub() // 添加主题 pub.addDep(dep1) // 发布者发布,通知这个主题的所有订阅更新 pub.publish(dep1)