それが可能かどうかはわかりませんが、Javascript でステートマシンを作成しました。
変数があります
現在の状態 = 状態 A
currentState をパラメーターとして他のオブジェクトに渡し、そのメソッドを呼び出したいと思います。
状態が変化するので、
currentState = stateB
currentState 呼び出しの stateB メソッドではなく、stateA メソッドを使用するオブジェクト
それを変更することは可能ですか?(参照渡し???)
それが可能かどうかはわかりませんが、Javascript でステートマシンを作成しました。
変数があります
現在の状態 = 状態 A
currentState をパラメーターとして他のオブジェクトに渡し、そのメソッドを呼び出したいと思います。
状態が変化するので、
currentState = stateB
currentState 呼び出しの stateB メソッドではなく、stateA メソッドを使用するオブジェクト
それを変更することは可能ですか?(参照渡し???)
ありえない。しかし、簡単に回避できます。例えば:
var StateMachine = (function() {
var _state= null;
return {
setState: function(state) {
_state = state;
},
getState: function() {
return _state;
}
}
})();
var stateA = {
hello: function() {
alert("state A");
}
};
var stateB = {
hello: function() {
alert("state B");
}
}
setState(stateA);
getState().hello(); // prints "state A";
setState(stateB);
getState().hello(); // prints "state B";
このようにして、ゲッター/セッター関数を介してのみ状態が変更されるようにします。
別のオブジェクトでラップすると、変更できます。開始するための非常に大まかなドラフトとして、次のサンプルを試すことができます。
var StateManager = { currentState: 'stateA' };
function doStuff(sm) {
console.log(sm.currentState); // stateA
changeState(sm);
console.log(sm.currentState); // stateB
}
function changeState(sm) {
sm.currentState = 'stateB';
}
doStuff(StateManager);
念のため、何が起こるかを以下に示します。
var o = {a:1}; // o points to an object
f(o); // the pointer is passed to the function
function f(obj) { // obj points to the object above
obj.a = 2; // actual object changed
obj = null; // obj no longer points to that object, but the object remains
}
console.log(o); // o still points to the object
ある程度は可能と言えます。それはすべて、Ecma スクリプト 5 のブラウザー サポートに依存します。
仕様Object.defineProperty
を見てください。そこで、プロパティのおよびメソッドを定義できます。get
set
これをより互換性のある方法で行うには、後で独自の定義済みgetState
およびsetState
メソッドでアクセスするプライベート変数を定義するクロージャーを使用します。