Last active
January 15, 2018 14:31
-
-
Save bz0/c3d2fdb9e77a9e3adda5a1cbb335662d to your computer and use it in GitHub Desktop.
オブザーバモデル
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//オブザーバのコンストラクタ作成 | |
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