JS发布订阅者模式

class Emit {
    constructor() {
      this.listening = {}  // 监听列表
    }

    // 发布
    $emit (key, fn) {
      (this.listening[key] || (this.listening[key] = [])).push(fn)
    }

    // 订阅
    $on () {
      let triggerRef = Array.prototype.shift.call(arguments)
      if (!this.listening[triggerRef] || this.listening[triggerRef].length === 0) {
        return
      }
      let fns = this.listening[triggerRef]
      for (let i = 0, fn; fn = fns[i]; i++) {
        fn.apply(this, arguments)
      }
    }

    // 移除
    $off (key, fn) {
      let fns = this.listening[key]
      if (!fns) {
        return false
      }
      if (!fn) {
        fn && (fn.length = 0)
      } else {
        let fnIndex = fns.indexOf(fn)
        fns.splice(fnIndex, 1)
        return true
      }
    }

  }

posted on 2021-08-21 18:30  chinesedon007  阅读(56)  评论(0)    收藏  举报