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) 收藏 举报
                    
                
                
            
        
浙公网安备 33010602011771号