2013-02-19 89 views
0

我需要创建命名常量。如何在javascript中创建枚举

例如:

NAME_FIELD: { 
      CAR : "car", 
      COLOR: "color"} 

使用:

var temp = NAME_FIELD.CAR // valid 
var temp2 = NAME_FIELD.CAR2 // throw exception 

最重要,我需要做此枚举的,如果密钥无效

+2

没有枚举在JavaScript – 2013-02-19 10:37:15

+1

请参阅:HTTP://计算器。 com/questions/287903/enums-in-javascript 我认为它是重复的 – 2013-02-19 10:38:43

回答

0

现在,自定义getter和setter方法造成的错误在普通的JavaScript对象已被弃用,一个解决方案可能是定义一个类为您的对象和set功能:

NAME_FIELD= { 
    CAR : "CAR", 
    COLOR: "COLOR" 
}; 

function MyClass(){ 
} 
MyClass.prototype.setProp = function (val) { 
    if (!(val in NAME_FIELD)) throw {noGood:val}; 
    this.prop = val; 
} 
var obj = new MyClass(); 

obj.setProp(NAME_FIELD.CAR); // no exception 
obj.setProp('bip'); // throws an exception 

但是,因为枚举不是本地构造,我不确定我会使用这样的事情。这听起来太像“试图在javascript中强制使用java功能”。你可能不需要这个。

+0

为什么使用setter,为什么不使用getter? – VisioN 2013-02-19 10:41:55

+0

@VisioN吸气剂当然也可以添加。 – 2013-02-19 10:44:54

+0

我的意思是OP想抛出异常,如果他*得到*无效的财产。 – VisioN 2013-02-19 10:47:12

1

最重要,我需要做此枚举造成的错误,如果密钥无效

不幸的是,你不能。你使用伪枚举的方式是通常的方式,即在对象上创建属性,但是如果你尝试从不包含对象的对象中检索属性,就不能让JavaScript引擎抛出错误存在。相反,引擎将返回undefined

你可以通过使用一个函数来做到这一点,这显然有实用性的问题。

或者(和我真的不喜欢这个主意),你可以做这样的事情:

var NAME_FIELD$CAR = "car"; 
var NAME_FIELD$COLOR = "color"; 

既然你访问这些免费的标识符,试图读取并不存在的价值:

var temp2 = NAME_FIELD$CAR2; 

...以ReferenceError失败。 (这是真实的,即使在非严格模式代码;在Horror of Implicit Globals仅适用于写作一个自由标识,从一个不读书。)