# 发布订阅

# 实现

class Event {
  constructor() {
    // 存储事件的数据结构
    this._cache = {};
  }
  // 绑定
  on(type, callback) {
    // 为了按类查找方便和节省空间,
    // 将同一类型事件放到一个数组中
    // 这里的数组是队列,遵循先进先出
    // 即先绑定的事件先触发
    if(!this._cache.hasOwnProperty(type)) {
        this._cache[type] = []
    }
    this._cache[type].push(callback)
    return this
  }
  // 触发
  trigger(type, data) {
    let fns = this._cache[type];
    if (Array.isArray(fns)) {
      fns.forEach((fn) => {
        fn(data);
      });
    }
    return this;
  }
  // 解绑
  off(type, callback) {
    let fns = this._cache[type];
    if (Array.isArray(fns)) {
      if (callback) {
        let index = fns.indexOf(callback);
        if (index !== -1) {
          fns.splice(index, 1);
        }
      } else {
        //全部清空
        fns.length = 0;
      }
    }

  }
}

// 测试用例
const event = new Event();
event.on('test', (a) => {
  console.log(a);
});
event.trigger('test', 'hello world');

event.off('test');
event.trigger('test', 'hello world')
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54