我有一个在各种状态下运行的应用程序,例如state1
,state2
和state3
。应用程序的某些行为将取决于应用程序所处的状态,例如,按下按钮,状态反过来会根据按下按钮等而改变。
我想知道是否有标准的习惯用法或设计模式来跟踪JavaScript中的状态变化。也许我的措辞有误导性或不准确,所以我举一个例子。我可能想检查这样的状态:
function foo() {
if (currentState === someState) {
doSomething();
}
}
但我想以一种不需要在多个地方硬编码字符串状态的方式跟踪状态,即我想避免这样做:
function foo() {
if (currentState === 'state1') {
doSomething();
}
}
首先想到的是创建一个appState
对象,该对象具有每个可能状态的属性:
var appState = {
state1: 'state1',
state2: 'state2',
state3: 'state3'
}
这样我可以更改当前的应用状态,如:
currentState = appState.state1;
并检查状态如:
if (currentState === appState.state1) {
...
}
然而,对于这个解决方案感到有些不适;也许重复属性名称和价值。
我没有足够的阅读或编写JavaScript经验来了解常见的模式和最佳实践。我想知道我上面描述的情况是否有JavaScript社区所遵循的标准解决方案/习惯用法。通过研究这个问题,我遇到了关于如何将模式应用于JavaScript的State design pattern和this nice post。我已经考虑过这条路线了,并没有完全打折,但是对于一个简单的应用程序来说,这个策略似乎不必要地复杂化。
答案 0 :(得分:2)
由于javascript非常动态,所以从来都不是最好的解决方案。它基于你你喜欢或不喜欢。我想,在一个事件上运行一个不同的函数,做这样的事情:
var states={
dark:{
alert:function(){
alert("its night");
},
//more to come
},
bright:{
alert:function(){
alert("its day");
}
}
}//etc
只需将功能放入其中,即可在每个状态下进行更改,因为您不希望重复使用。您可以设置当前状态:
var currentstate=states.dark;
现在你可以在你的代码中的某个地方做:
currentstate.alert();
如果将状态设置为亮,这也将起作用。要检查当前的状态,您可以这样做:
if(currentstate==states.dark)
但是状态对象在你的例子中并非毫无意义。
PS: 要改进上层结构,可以使用OOP来创建子状态(行为类似于另一种状态)
states.grey=Object.create(states.dark);
states.grey.alert=function(){
alert("its getting brighter...");
};
这也将解决您的拼写错误问题:
state.dak //error: cannot read property of undefined.