js观察者模式简单实现
直接上代码
function PubSub(){
this.handlers = {}; //{'aaa':[cb1,cb2],'abc':[cb1,cb2]}
}
PubSub.prototype = {
//on 相当于订阅者在发布者那里存了一个宝箱(回调函数cb),宝箱的钥匙是eventType
on : function(eventType,cb){
var self = this;
if(!(eventType in self.handlers)){
self.handlers[eventType] = [];
}
self.handlers[eventType].push(cb);
return self;
},
//emit 发布者拿出钥匙(eventType),找出与其对应的宝箱(cb),打开它(执行回调cb)。
emit : function(eventType){
var self = this;
var argsArr = Array.prototype.slice.call(arguments,1);
for(var i = 0;i<self.handlers[eventType].length;i++){
self.handlers[eventType][i].apply(self,argsArr);
}
return self;
},
//拿走与这把钥匙所对应的宝箱(cb)
removeLisener : function(eventType){
var self = this;
if(eventType in self.handlers){
delete self.handlers[eventType];
}
}
}
//简单使用方式
var pub = new PubSub();
pub.on('abc',function(a,b,c){
console.log(a,b,c); //33,44,66
});
pub.on('aaa',function(a,b,c){
console.log(a+1,b+1,c+1); //34,45,67
});
pub.emit('abc',33,44,66);
pub.emit('aaa',33,44,66);