这里有一份简洁的前端知识体系等待你查收,看看吧,会有惊喜哦~若是以为不错,恳求star哈~前端
发布---订阅模式又叫观察者模式,它定义了对象间的一种一对多的关系,让多个观察者对象同时监听某一个主题对象,当一个对象发生改变时,全部依赖于它的对象都将获得通知。git
假设小红看上了一双鞋子,但该鞋子已经断货了,卖家承诺她到货通知。与此同时,小明、小花灯也关注了这双鞋子。github
在这个场景中,卖家就是发布者,小红等人都属于订阅者。当鞋子到货时,会依次通知到每一个人。设计模式
建立订阅者须要消耗必定的时间和内存。若是过分使用的话,反而使代码很差理解及代码很差维护等等。缓存
发布订阅模式是最经典的设计模式之一,介绍的文章也很是多。这里不打算过多介绍。直接上代码~~~bash
var Event = (function(){
var list = {},
listen,
trigger,
remove;
listen = function(key,fn){
if(!list[key]) {
// 若是尚未订阅过此类消息,给该类消息建立一个缓存列表
list[key] = [];
}
list[key].push(fn); // 订阅消息添加到缓存列表
};
trigger = function(){
var key = Array.prototype.shift.call(arguments), // 取出消息类型名称
fns = list[key]; // 取出该消息对应的回调函数的集合
// 若是没有订阅过该消息的话,则返回
if(!fns || fns.length === 0) {
return false;
}
for(var i = 0, fn; fn = fns[i++];) {
fn.apply(this,arguments); // arguments 是发布消息时附送的参数
}
};
remove = function(key,fn){
// 若是key对应的消息没有订阅过的话,则返回
var fns = list[key];
// 若是没有传入具体的回调函数,表示须要取消key对应消息的全部订阅
if(!fns) {
return false;
}
if(!fn) {
fns && (fns.length = 0);
}else {
for(var i = fns.length - 1; i >= 0; i--){
var _fn = fns[i];
if(_fn === fn) {
fns.splice(i,1);// 删除订阅者的回调函数
}
}
}
};
return {
listen: listen,
trigger: trigger,
remove: remove
}
})();
// 测试代码以下:
Event.listen("color",function(size) {
console.log("尺码为:"+size); // 打印出尺码为42
});
Event.trigger("color",42);
复制代码