用于跟踪JavaScript中状态和状态变化的成语

时间:2017-01-18 17:35:48

标签: javascript design-patterns

我有一个在各种状态下运行的应用程序,例如state1state2state3。应用程序的某些行为将取决于应用程序所处的状态,例如,按下按钮,状态反过来会根据按下按钮等而改变。

我想知道是否有标准的习惯用法或设计模式来跟踪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 patternthis nice post。我已经考虑过这条路线了,并没有完全打折,但是对于一个简单的应用程序来说,这个策略似乎不必要地复杂化。

1 个答案:

答案 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.