0

我不知道这是否可能,但我们用 Javascript 制作了一个状态机。

我们有变量

当前状态 = 状态 A

我想将 currentState 作为参数传递给另一个对象,该对象调用它的方法。

状态改变了,所以我们有

当前状态 = 状态 B

使用 currentState 调用的对象是 stateA 方法,而不是 stateB

有没有可能让它随之改变?(通过引用传递???)

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

通过这种方式,您可以确保仅通过 getter/setter 函数更改状态。

于 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.definePropertyin spec。在那里,您可以为您的属性定义getset方法。

为了更兼容地执行此操作,请使用闭包,您可以在其中定义一个私有变量,稍后您可以使用自己定义的getStatesetState方法访问该变量。

于 2013-10-22T07:54:44.603 回答