明確でない要件に応じて、コードは多かれ少なかれ複雑になります。必要がない場合はパターンを使用しないでください。パターンは、要件に応じてさまざまな方法で調整できます。本当に必要がない場合は、すべてのソリューションを構築しようとしないでください。
多くのオブザーバーがあり、車の作成時にそれらを知っている場合は、使用できます
function Car(onGearChangedArray) {
this.triggerGearChanged = function() {
for (var i=0;i<onGearChangedArray.length;i++) {
onGearChangedArray[i]();
}
};
window.setTimeout(this.triggerGearChanged,2000);
}
var car = new Car([function(){
console.log("gear changed");
}]);
オブザーバーが 1 つしかない場合は、for ループを取り除くことができます。
ただし、実行時にそれらを追加する柔軟性が必要な場合:
function Car() {
var onGearChangedCallbacks = [];
this.onGearChanged = function(callback) {
onGearChangedCallbacks.push(callback);
};
this.triggerGearChanged = function() {
for (var i=0;i<onGearChangedCallbacks.length;i++) {
onGearChangedCallbacks[i]();
}
};
window.setTimeout(this.triggerGearChanged,2000);
}
var car = new Car();
car.onGearChanged(function(){
console.log("gear changed");
});
または、次のレベルで抽象化したい場合
function Event() {
var callbacks = [];
this.bind = function(callback) {
callbacks.push(callback);
};
this.fire = function() {
for (var i=0;i<callbacks.length;i++) {
callbacks[i]();
}
};
}
function Car() {
this.gearChanged = new Event();
window.setTimeout(this.gearChanged.fire,2000);
}
var car = new Car();
car.gearChanged.bind(function(){
console.log("gear changed");
});
Khanh TO の抽象化のアイデアに感謝します。パラメータなしで表示したかっただけです。
このイベント処理コード (エラー処理など) を自分で記述する必要がないように、より洗練されたものを使用することを検討することもできますが、これも必要に応じて異なります。フェイル ファスト戦略が必要ですか、それともエラーをログに記録するだけですか? リスナーは登録解除する必要がありますか? triggerGearChanged が別の triggerGearChanged につながる可能性があるため、無限ループに陥ることはありませんか? パラメータを渡す必要がありますか? パラメータを渡す必要がない場合は、パラメータを渡さないでください。
unserscore.js が好きなら、良いスタートはhttp://mattmueller.me/blog/underscore-extension-observer-patternかもしれません