//如下實現乙個通用發布者
//定義發布者物件...{}是定義乙個物件
var publisher = ,
subscribe: function(fn,type)
this.subscribers[type].push(fn);
},unsubscribe: function(fn,type),
publish: function(publication, type),
visitsubscribers: function(action,arg,type) else }}
}};//定義乙個函式makepublisher(),它接受乙個物件作為物件,通過把上述通用發布者的方法複製到該物件中,從而將其轉換為乙個發布者
function makepublisher(o)
}o.subscribers = ;
}//實現*****物件
var ***** = ,
monthly: function()
};//將*****構造成乙個發布者
makepublisher(*****); //makepublisher方法把發布者publisher的方法複製到*****物件中,從而使其成為乙個發布者
//以上已經有了乙個發布者。看看訂閱物件joe,該物件有兩個方法:註冊時,將此方法傳入*****的訂閱方法,完成註冊,則在發布訊息時會呼叫該方法
var joe = ,
sundayprenap : function(monthly)
};//*****註冊joe(即joe向*****訂閱)
*****.subscribe(joe.drinkcoffee); //訂閱any型別
*****.subscribe(joe.sundayprenap,'monthly'); //定義monthly型別
//即joe為預設「any」事件提供了乙個可被呼叫的方法,而另乙個可被呼叫的方法則用於當「monthly」型別的事件發生時的情況。現在讓我們來觸發一些事件:
*****.daily(); //just readbig news today
*****.monthly(); //about to fall asleep reading thisinteresting analysis
var jack =
};*****.subscribe(jack.read*****);
*****.daily(); //輸出: just readbig news today jack readbig news today
//以上**的好處在於,*****物件並沒有硬編碼joe,而joe中也並沒有硬編碼*****。此外,**中也沒有那些知道一切的中介者物件。由於參與物件是松耦合的,我們可以向*****新增更多的訂閱者而根本不需要修改這些物件。
//進一步擴充套件,讓joe成為發布者(比如:部落格和微博上任何人都可以是發布者)
makepublisher(joe);
joe.tweet = function(msg) ;
//現在,*****的公關部門決定讀取讀者的tweet,並訂閱joe的資訊,那麼需要提供方法readtweets():
*****.readtweets = function(tweet);
joe.subscribe(*****.readtweets); //*****訂閱joe的tweet
joe.tweet('hello the world!'); //call big meeting! someone hello the world!
另一種思路
var event = ;
} if(!this.handles[eventname])
this.handles[eventname].push(callback);
},// 觸發事件 eventname
emit: function (eventname) }}
};// 測試1
event.on('test', function (result) );
event.on('test', function () );
event.emit('test', 'hello world'); // 輸出 'hello world' 和 'test'
var person1 = {};
var person2 = {};
object.assign(person1, event);
object.assign(person2, event);
person1.on('call1', function () );
person2.on('call2', function () );
person1.emit('call1'); // 輸出 'person1'
person1.emit('call2'); // 沒有輸出
person2.emit('call1'); // 沒有輸出
person2.emit('call2'); // 輸出 'person2'
Js 觀察者模式
function eventtarget eventtarget.prototype this.handlers type push handler fire function event if this.handlers event.type instanceof array removehand...
JS 觀察者模式
被觀察者 function observed 將observer註冊到observed上 observed.prototype.attach function s 產生新狀態 observed.prototype.setstate function newstate 觀察者 function obs...
js 觀察者模式
觀察者模式定義一種一對多的關係,多個觀察者訂閱乙個主題物件,當主題物件發生改變的時候通知所有觀察者,使他們能實現更新。具體實現方式 定義乙個被觀察物件,定義乙個主題陣列,觀察者訂閱主題通過往陣列物件內新增 函式來實現,當主題發生改變時輪流呼叫 函式。var subpub this.topics to...