2015-11-30 21 views
4

我需要一些幫助。我想用現代的javascript來實現Enum。我想這是不可改變的,認爲它會看起來就像這樣:在現代javascript中實現enum作爲不可變的類javascript(es2015)

class AlphabetEnum{ 
    static get A(){ 
    return 'a'; 
    }, 
    static get B(){ 
    return 'b'; 
    } 
... 
} 

然而,這是一個有點討厭寫這一切的干將。所以我很好奇 - 是否有機會使用計算方法名稱以及其他一些es2015功能來優化此功能。

在結果我夢想有這樣的事情:

let alph = [a, b, c, ..., z]; 
class AlphabetEnum{ 
     static get [some__clever_way_to_resolve_names_from_<alph>](){ 
     return some_clever_way_to_understand_what's_called(); 
     }, 
    } 

回答

6

一個類沒有意義。你不需要一個靜態獲得者的函數。你只是想要一個不可變對象 - 這很簡單:

const AlphabetEnum = Object.freeze({ 
    A: "a", 
    B: "b", 
    … 
}); 

當然,你也可以動態地創建,如果上市的所有屬性太麻煩了:

const AlphabetEnum = {}; 
for (let i=0; i<26; i++) 
    AlphabetEnum[String.fromCharCode(65+i)] = String.fromCharCode(97+i); 
Object.freeze(AlphabetEnum); 
3

你會做同樣的方式在ES5,與Object.defineProperty

class AlphabetEnum {} 

['a', 'b', 'c', ..., 'z'].forEach(letter => { 
    Object.defineProperty(AlphabetEnum, letter.toUpperCase(), { 
    get:() => letter, 
    configurable: true, // remove this line if not needed/wanted 
    }); 
}); 

然而,僅僅使用了class靜態屬性是一種反模式IMO。在這種情況下,您還可以使用一個普通對象:

var AlphabetEnum = {}; 
+0

你可能想後'配置刪除逗號:真的',否則很好的答案:)。 – Arg0n

+0

@ Arg0n:我爲什麼要那樣做? –

+1

因爲那更漂亮! (這完全是一個事實,而不是一個意見)'v ++' – Cerbrus