观察者模式
当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知,也简称发布-订阅模式。类似微信订阅公众号,当它有新的文章发表后,就会推送给我们所有订阅的人
优点:
1.我们无需关注公众号是否有新的文章发布
2.我们和公众号没有强耦合在一起,公众号不关心谁订阅了它
自定义事件
现在我们想要实现这样的功能,定义一个事件,它有以下功能
- 监听事件(订阅公众号)
- 触发事件(公众号发布)
- 移除事件(取消关注公众号)
//代码如下
var Event = (function(){
var list = {},//存储公众号
on,
emit,
remove;
//监听事件
on = function(key,fn){
if(!list[key]){
list[key] = [];如果不存在key,创建
}
list[key].push(fn);//将回调函数存储到对应的key
};
//触发事件
emit = function(){
var key = Array.prototype.shift.call(arguments);//获取key值
var msg = list[key];
if(!msg || msg.length === 0){
return false;//不存在对应的回调函数,返回false
}
for(var i = 0; i < msg.length; i++){
msg[i].apply(this,arguments);//循环执行回调函数
}
};
//移除事件
remove = function(key,fn){
var msg = list[key];
if(!msg){
return false;//如果不存在事件 返回false
}
if(!fn){
delete list[key];//没有指定的回调函数,则删除key 可以理解公众号下架了
}else{
for(var i = 0; i < msg.length; i ++){
if(msg[i] === fn){
msg.splice(i, 1);//删除指定的回调函数
}
}
}
};
// 返回对象
return {
on:on,
emit:emit,
remove:remove
}
})();
var fn = function(data){
console.log(data+"推送消息来啦~~~")
}
Event.on('click',fn);//订阅公众号
Event.emit('click',"2018.01.15")//发布公众号
Event.remove('click',fn);//取消关注公众号
网友评论