我的回答

  1. class Observer {
  2. constructor() {
  3. this.ob = {}
  4. }
  5. depend(key, cb) {
  6. if (!this.ob[key]) {
  7. this.ob[key] = []
  8. }
  9. this.ob[key].push(cb)
  10. }
  11. notify(key) {
  12. this.ob[key] && this.ob[key].forEach(cb => cb())
  13. }
  14. }

参考回答

  1. class Subject { // 被观察者的类 被观察者 需要将观察者收集起来
  2. constructor(name) {
  3. this.name = name;
  4. this.state = '非常开心'
  5. this.observers = [];
  6. }
  7. attach(o) { // 进行收集
  8. this.observers.push(o); // on
  9. }
  10. setState(newState) {
  11. this.state = newState;
  12. this.observers.forEach(o => o.update(this.name, newState)) // emit
  13. }
  14. }
  15. class Observer { // 观察者
  16. constructor(name) {
  17. this.name = name;
  18. }
  19. update(s, state) {
  20. console.log(this.name + ":" + s + '当前' + state);
  21. }
  22. }
  23. // vue 数据变了(状态) 视图要更新 (通知依赖的人)
  24. let s = new Subject('小宝宝');
  25. let o1 = new Observer('爸爸');
  26. let o2 = new Observer('妈妈');
  27. s.attach(o1)
  28. s.attach(o2)
  29. s.setState('不开心了')
  30. s.setState('开心了')