function Observer(){
this.handles = {};
}
Observer.prototype = {
subscribe:function(type,handle){
if(!this.handles[type]){
this.handles[type] = [];
}
this.handles[type].push(handle);
},
unsubscribe:function(type,handle){
var listener = this.handles[type];
if(listener){
if(!handle){
listener.length = 0;
}else{
for(var i = 0;i < listener.length;i++){
if(listener[i] === handle){
listener.splice(i,1);
}
}
}
}
},
publish:function(type,event){
if(!this.handles[type]){
return false;
}
for(var i = 0;i < this.handles[type].length;i++){
var handle = this.handles[type][i];
handle(event);
}
}
}
var p = new Observer();
var fn = function(name){
console.log('mm:'+name);
}
p.subscribe('mm',fn);
p.publish('mm','123321'); //"mm:123321"
複製程式碼
關鍵點:
- 注意釋出者和訂閱者之間的關係是通過釋出者上的一個物件來建立互動的,即handles
- 訂閱者本質上是一個函式(javascript中函式也是一個物件)
- 訂閱,取消訂閱,釋出的功能都在釋出者身上,訂閱者只是通過依附(attach)或者脫離(disattach)來訂閱或者退訂事件