枚举中的 Javascript 枚举
我在 javascript 中有以下“Enum”来指示我的应用程序的状态:
var State = {
STATE_A: 0,
STATE_B: 1,
STATE_C: 2
//...
}
现在,我希望每个状态都有一个“子状态”。例如,STATE_B
可能位于 STATE_B1
或 STATE_B2
中……
构造此结构的最佳方法是什么?我会以某种方式在 State
“enum” 中嵌套一个“enum”吗?谢谢
如果有更好的方法来构建这个整体(除了枚举)我洗耳恭听。基本上,我需要能够设置和检查应用程序的状态,并且每个状态都可以(但不是必需)附加一个可以设置和检查的子状态。如果解决方案允许我嵌套超过 1 层,那就更好了。
I have the following "Enum" in javascript to indicate the state of my application:
var State = {
STATE_A: 0,
STATE_B: 1,
STATE_C: 2
//...
}
Now, I want each state to have a "sub-state". So for example, STATE_B
could be in STATE_B1
or STATE_B2
...
What would be the best way to structure this? Would I somehow nest an "enum" within the State
"enum" ? Thanks
If there is a better way to structure this altogether (other than enums) I'm all ears. Basically I need to be able to set and check the state of my application, and each state can (but not necessary) have a sub-state attached to it which can be set and checked. Even better if the solution allows me to go more than 1 level of nesting deep.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
你所做的并不是真正的枚举。您正在使用本机 Javascript 对象,并将它们视为枚举,当您想要在 Javascript 中使用类似枚举的对象时,这是完全可以接受的。
要回答您的问题,是的,您可以完全嵌套对象:
然后您只需使用点表示法来设置这些值,例如
State.State_B.SUBSTATE_2 = "active"。
What you're doing isn't really enums. You're using native Javascript objects and just treating them like enums, which is perfectly acceptable when you want an enum-like object in Javascript.
To answer your question, yes, you can totally nest objects:
You then just use the dot notation in order to set those values, like
State.State_B.SUBSTATE_2 = "active"
.如果需要,您可以使用某种位字段:
因此前 8 位保留用于设置子状态。当然,只要根状态和子状态可以容纳在 32 位整数内,您就可以增加此值。如果您需要解释为什么/如何工作(按位运算符),请告诉我。
You could use some sort of bit-field if you want:
So the first 8 bits are reserved for setting the sub-state. You could, of course, increase this as long as the root-state and sub-state can fit inside a 32-bit integer. If you need explanation as to why/how this works (bit-wise operators), let me know.
我猜你想写一些类似的内容
你可以简单地在 State 对象中定义另一个层,例如
Edit: 根据对你的问题的评论,另一种方法可能是这样的。
现在你可以用以下方式调用一切
I guess you want to write something like
You could simply define another layer in your State object like
Edit: Based on the comments on your question another approach could be this.
Now you can call everything with
由于 JavaScript 不支持运算符重载,因此您无法使用
==
运算符直接测试子状态的相等性。最接近的方法是使用instanceof
运算符来检查状态是否属于给定类型,例如:由于函数也是对象,因此您可以将嵌套添加到
State
函数:并检查其类型:
Since JavaScript does not support operator overloading, you cannot directly test for equality of substates using the
==
operator. The closest you can get is to use theinstanceof
operator to check if a state is of a given type, for example:And since functions are also objects, you can add your nesting right into the
State
function:And check its type: