JavaScript中的class:实现一个事件类,使用订阅发布模式

 

class Event {
  constructor() {
    // 存储事件的数据结构
    // 为了查找迅速,使用了对象(字典)
    this._cache = {};
  }
  // 绑定
  on(type, callback) {
    // 为了按类查找方便和节省空间,
    // 将同一类型事件放到一个数组中
    // 这里的数组是队列,遵循先进先出
    // 即先绑定的事件先触发
    let fns = (this._cache[type] = this._cache[type] || []);
    if (fns.indexOf(callback) === -1) {
      fns.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;
      }
    }
    return this;
  }
}
// 测试用例
const event = new Event();
event.on("test", (a) => {
  console.log(a);
});
event.trigger("test", "hello world");

event.off("test");
event.trigger("test", "hello world");

 

上一篇:centos 为OPENJDK配置JAVA_HOME环境变量,安装MAVEN


下一篇:C# -- 等待异步操作执行完成的方式