2013-02-19 51 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僅適用於寫作一個自由標識,從一個不讀書。)