2013-10-22 80 views
0

我不知道这是否可能,但我们在Javascript中创建了一个状态机。Javascript通过改变对象

我们有可变

currentState =状态σ

我想在currentState作为参数传递到其他对象,调用它的方法。

状态的变化,所以我们必须

currentState = stateB

使用在currentState调用的的状态σ方法,而不是stateB

是否有可能让它跟着改变的对象呢? (通过参考???)

+0

您可以发布您正在使用的逻辑或代码,它似乎是使用currentState值更改对象之后的状态。 –

回答

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 
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函数更改状态。

0

我会说这在某种程度上是可能的。 这一切都取决于Ecma脚本5的浏览器支持。

查看spec中的Object.defineProperty。在那里你可以定义你的财产getset方法。

要获得更加兼容的方法,可以使用闭包定义一个私有变量,稍后您可以使用自定义的getStatesetState方法访问该变量。