设计模式

观察者模式

let Observer = (function () {
  let obj = {};
  return {
    add: function (name, fn) {
      (obj[name] || (obj[name] = [])).push(fn);
    },
    trigger: function (name, arr) {
      if (!obj[name] || obj[name].length === 0) {
        return false;
      }
      obj[name].forEach((value) => {
        value.apply(obj, arr);
      });
    },
    off: function (name, fn) {
      let len = arguments.length;
      if (len === 0) {
        obj = {};
      } else if (len === 1) {
        obj[name] = [];
      } else if (len === 2) {
        obj[name].forEach((value, index) => {
          // 引用类型全等或相等等于地址相同
          if (value === fn) {
            obj[name].splice(index, 1);
          }
        });
        console.log(obj);
      }
    },
    /* 
                一次性事件:用于添加事件的方法,执行一次之后就销毁
    */
    once: function (name, fn) {
      // 备份this
      var me = this;
      // 添加一个事件
      function xxoo() {
        // 运行一次
        fn();
        // 当其执行结束之后,自动销毁
        me.off(name, xxoo);
      }
      // 添加事件
      this.add(name, xxoo);
      /* 
        为什么要使用xxoo这个函数?
        因为fn传过来的有可能是一个函数体,移除事件的时候只能移除引用的函数,命名的函数
        达到移除的效果
       */
    },
  };
})();
Observer.add('click', function() {
    console.log('111');
});
Observer.add('click', function() {
    console.log('333');
});
Observer.once('click', function() {
    console.log('222');
});
Observer.trigger('click');
Observer.trigger('click');
View Code

 

posted @ 2022-01-31 06:37  还有什么值得拥有  阅读(19)  评论(0编辑  收藏  举报