Skip to content

Instantly share code, notes, and snippets.

@bz0
Last active January 15, 2018 14:31
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save bz0/c3d2fdb9e77a9e3adda5a1cbb335662d to your computer and use it in GitHub Desktop.
Save bz0/c3d2fdb9e77a9e3adda5a1cbb335662d to your computer and use it in GitHub Desktop.
オブザーバモデル
//オブザーバのコンストラクタ作成
function Observer(){
this.listeners = {};
}
/*
* イベントを登録(同じイベント名でも複数登録可能)
* @param string event イベント名
* @param function func 関数
*/
Observer.prototype.on = function(event, func){
//引数のイベント名がリスナに既に登録されているか
if(! this.listeners[event]){
//登録されてなければ、配列を格納
this.listeners[event] = [];
}
//リスナにイベントを追加
this.listeners[event].push(func);
}
/*
* イベントを削除する(引数で指定した同じイベント名・関数のイベントを削除します)
* @param string event イベント名
* @param function func 関数
*/
Observer.prototype.off = function(event, func){
//削除するイベント名の配列をrefに格納
var ref = this.listeners[event],
//該当のイベント名がいくつ登録されているかを取得
len = ref.length;
//該当のイベント名で登録されている数だけ回す
for (var i=len-1; i>=0; i--){
var listener = ref[i];
if (listener === func){
ref.splice(i, 1);
}
}
}
/*
* イベントを実行する(引数で指定したイベント名)
* @param string event イベント名
*/
Observer.prototype.trigger = function(event){
var ref = this.listeners[event];
for(var i=0,len=ref.length; i<len; i++){
var listener = ref[i];
//listenerが関数であれば実行
if (typeof listener === "function") listener();
}
}
var observer = new Observer();
var greet = function(){
console.log("Good morning");
}
var greet2 = function(){
console.log("Good morning2");
}
observer.on("morning", greet2);
observer.off("morning", greet);
observer.trigger("morning");
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment