0

それが可能かどうかはわかりませんが、Javascript でステートマシンを作成しました。

変数があります

現在の状態 = 状態 A

currentState をパラメーターとして他のオブジェクトに渡し、そのメソッドを呼び出したいと思います。

状態が変化するので、

currentState = stateB

currentState 呼び出しの stateB メソッドではなく、stateA メソッドを使用するオブジェクト

それを変更することは可能ですか?(参照渡し???)

4

3 に答える 3

0

ありえない。しかし、簡単に回避できます。例えば:

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";

このようにして、ゲッター/セッター関数を介してのみ状態が変更されるようにします。

于 2013-10-22T07:49:40.377 に答える
0

別のオブジェクトでラップすると、変更できます。開始するための非常に大まかなドラフトとして、次のサンプルを試すことができます。

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
于 2013-10-22T07:45:16.473 に答える
0

ある程度は可能と言えます。それはすべて、Ecma スクリプト 5 のブラウザー サポートに依存します。

仕様Object.definePropertyを見てください。そこで、プロパティのおよびメソッドを定義できます。getset

これをより互換性のある方法で行うには、後で独自の定義済みgetStateおよびsetStateメソッドでアクセスするプライベート変数を定義するクロージャーを使用します。

于 2013-10-22T07:54:44.603 に答える