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