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 對象就有了效果