シングルトン オブジェクトを実装しようとするコード スニペストを次に示します。
Game.Score = (
function () {
....
var currentScorePolicy = {
onBrickHitCorrectBasket: function () { alert("defaultScorePolicy::onBrickHitCorrectBasket called"); },
onBrickHitWrongBasket: function () { },
onBrickMissAllBaskets: function () { }
};
...
return {
....
applyScorePolicyWithBonusEnabled: function (scorePerQuestion, maxBonusFactor) {
currentScorePolicy = {
onBrickHitCorrectBasket: function () {
// alert("applyScorePolicyWithBonusEnabled::onBrickHitCorrectBasket called");
raise();
enlargeBonus();
},
onBrickHitWrongBasket: function () {
reduce();
resetBonus();
},
onBrickMissAllBaskets: function () { }
};
// alert("applyScorePolicyWithBonusEnabled called");
that.currentScorePolicy.onBrickHitCorrectBasket();
},
applyScorePolicyWithBonusDisabled: function (scorePerQuestion) {
currentScorePolicy = {
onBrickHitCorrectBasket: function () {
raise(scorePerQuestion);
},
onBrickHitWrongBasket: function () {
reduce(scorePerQuestion);
},
onBrickMissAllBaskets: function () { }
};
},
onBrickHitCorrectBasket: currentScorePolicy.onBrickHitCorrectBasket,
onBrickHitWrongBasket: currentScorePolicy.onBrickHitWrongBasket,
onBrickMissAllBaskets: currentScorePolicy.onBrickMissAllBaskets
}
})();
これは、ゲーム中にスコアリング ポリシーが変更される可能性がある場合の、私のゲームのスコア オブジェクトです。applyScorePolicyWithBonusEnabled
Score オブジェクトはとの 2 つのメソッドを公開します。これらapplyScorePolicyWithBonusDisabled
の目的は currentScorePolicy フィールドを変更することです。
ここで、アプリを起動するときに Score を初期化して を呼び出しますapplyScorePolicyWithBonusEnabled
。後で、実行されることを期待して Score.onBrickHitCorrectBasket を呼び出しますScorePolicyWithBonus.onBrickHitCorrectBasket
が、実際に実行されているのは、元のスタブcurrentScorePolicy.onBrickHitCorrectBasket
が呼び出されることです。そこに仕掛けたアラートの呼び出しでわかります。
どうしたの?applyScorePolicyWithBonusEnabled()
呼び出しで新しいオブジェクトが に割り当てられなかったのはなぜcurrentScorePolicy
ですか?