javascript設計模式之 發佈訂閱模式

var office = {
  fnlist:{},
  listen: function(key,fn){
    if(!this.fnlist[key]){
       this.fnlist[key] = []
    }
    this.fnlist[key].push(fn)
  },
  trigger: function(){
    var key = Array.prototype.shift.call(arguments),
        fnArr = this.fnlist[key];
    if(!fnArr || fnArr.length===0){
       
       return false
    }
    for(var i =0,fn;fn=fnArr[i++];){
         fn.apply(this,arguments)
    }
  }
}

使用app

office.listen('a',function(data){console.log(data)})
office.trigger('a',"我就是數據")
//輸出 我就是數據

發佈訂閱模式的通用實現
修改下以前的代碼this

var event= {
  fnlist:{},
  listen: function(key,fn){
    if(!this.fnlist[key]){
       this.fnlist[key] = []
    }
    this.fnlist[key].push(fn)
  },
  trigger: function(){
    var key = Array.prototype.shift.call(arguments),
        fnArr = this.fnlist[key];
    if(!fnArr || fnArr.length===0){
       
       return false
    }
    for(var i =0,fn;fn=fnArr[i++];){
         fn.apply(this,arguments)
    }
  }
}

js是一門解釋之行的語言,給對象動態欠佳職責是很簡單的事情prototype

咱們須要一個installEvent方法code

var installEvent = function(obj){
     for(var i in event){
      obj[i] = event[i]
    }
}

須要讓一個對象 有 發佈訂閱功能
只須要對象

var a = {}
installEvent(a);
// a 對象就有了效果
相關文章
相關標籤/搜索