我不知道这是否可能,但我们用 Javascript 制作了一个状态机。
我们有变量
当前状态 = 状态 A
我想将 currentState 作为参数传递给另一个对象,该对象调用它的方法。
状态改变了,所以我们有
当前状态 = 状态 B
使用 currentState 调用的对象是 stateA 方法,而不是 stateB
有没有可能让它随之改变?(通过引用传递???)
我不知道这是否可能,但我们用 Javascript 制作了一个状态机。
我们有变量
当前状态 = 状态 A
我想将 currentState 作为参数传递给另一个对象,该对象调用它的方法。
状态改变了,所以我们有
当前状态 = 状态 B
使用 currentState 调用的对象是 stateA 方法,而不是 stateB
有没有可能让它随之改变?(通过引用传递???)
不可能。但是您可以轻松绕过它。例如:
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 函数更改状态。
如果将其包装在另一个对象中,则可以更改它。就像一个非常粗略的草稿让你开始,你可以试试这个示例:
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
in spec。在那里,您可以为您的属性定义get
和set
方法。
为了更兼容地执行此操作,请使用闭包,您可以在其中定义一个私有变量,稍后您可以使用自己定义的getState
和setState
方法访问该变量。