2013-10-22 121 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方法訪問該變量。