我不知道这是否可能,但我们在Javascript中创建了一个状态机。Javascript通过改变对象
我们有可变
currentState =状态σ
我想在currentState作为参数传递到其他对象,调用它的方法。
状态的变化,所以我们必须
currentState = stateB
使用在currentState调用的的状态σ方法,而不是stateB
是否有可能让它跟着改变的对象呢? (通过参考???)
我不知道这是否可能,但我们在Javascript中创建了一个状态机。Javascript通过改变对象
我们有可变
currentState =状态σ
我想在currentState作为参数传递到其他对象,调用它的方法。
状态的变化,所以我们必须
currentState = stateB
使用在currentState调用的的状态σ方法,而不是stateB
是否有可能让它跟着改变的对象呢? (通过参考???)
如果将其包装在另一个对象中,则可以对其进行更改。正如一个非常粗略的草稿,让你开始,你可以试试这个例子:
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
不可能的。但你可以轻松解决它。例如:
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函数更改状态。
我会说这在某种程度上是可能的。 这一切都取决于Ecma脚本5的浏览器支持。
查看spec中的Object.defineProperty
。在那里你可以定义你的财产get
和set
方法。
要获得更加兼容的方法,可以使用闭包定义一个私有变量,稍后您可以使用自定义的getState
和setState
方法访问该变量。
您可以发布您正在使用的逻辑或代码,它似乎是使用currentState值更改对象之后的状态。 –