我不知道這是否可能,但我們在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值更改對象之後的狀態。 –