在javascript中创建枚举

时间:2015-02-02 16:08:16

标签: javascript enums

我想在javascript中创建枚举,我做了以下代码,我想验证这是正确的方法。

    var dataStates = {
    withMock: "withM",
    withoutMock: "withoutM",
};

没关系?

我希望例如像

一样使用它
oCation.dataMode === dataStates.withMock

并且state.data.withMock将保留该值,但我不确定它是否正确...

2 个答案:

答案 0 :(得分:1)

您创建的是具有命名属性的对象。这不是Java意义上的Enum。也就是说,没有语言约束强制执行唯一性和单个实例。但是,您所做的将满足您在问题中指定的要求。

答案 1 :(得分:1)

Javascript没有正确的(静态)enum类型,但是你可以使用Typescript为其枚举生成的相同代码来实现非常接近的东西。

要提供枚举但仍然是有效的JS,你需要一个对象,其中每个枚举元素(名称)是一个键,映射到一个唯一的值(通常是一个int,因为大多数带有枚举的语言用整数值来支持它们)。 / p>

对于类似enum Color {Red, Green, Blue};的枚举,您最终会得到包含以下内容的代码:

Color[Color["Red"] = 0] = "Red";
Color[Color["Green"] = 1] = "Green";
Color[Color["Blue"] = 2] = "Blue";

这将创建一个对象,其中包含每个枚举元素名称的键,以及每个元素的值。最终的对象如下:

var Color;

(function(Color) {
  Color[Color["Red"] = 0] = "Red";
  Color[Color["Green"] = 1] = "Green";
  Color[Color["Blue"] = 2] = "Blue";
})(Color || (Color = {}));

document.getElementById("result").textContent = JSON.stringify(Color);
<pre id="result"></pre>

这允许您使用传统的Color.Red语法访问枚举值,但也允许您使用Color[Color.Red](或包含其中一个枚举值的变量)将值映射回名称。 / p>

例如:

var Color;

(function(Color) {
  Color[Color["Red"] = 0] = "Red";
  Color[Color["Green"] = 1] = "Green";
  Color[Color["Blue"] = 2] = "Blue";
})(Color || (Color = {}));

document.getElementById("red").textContent = Color.Red; // Should print "0"

var currentColor = Color.Green;
document.getElementById("green").textContent = Color[currentColor]; // Should print "Green"

currentColor = Color.Blue;
document.getElementById("blue").textContent = Color[currentColor]; // Should now print "Blue"
<pre id="red"></pre>
<pre id="green"></pre>
<pre id="blue"></pre>