2017-06-09 41 views
22

Przebudowuję stary projekt Java w JavaScript i zdałem sobie sprawę, że nie ma dobrego sposobu na wyliczanie w JS.Wylicza w JavaScript z ES6

Najlepszym mogę wymyślić to:

const Colors = { 
    RED: Symbol("red"), 
    BLUE: Symbol("blue"), 
    GREEN: Symbol("green") 
}; 
Object.freeze(Colors); 

const utrzymuje Colors przed przeniesiony, a zamrożenie zapobiega mutacji klucze i wartości. Używam symboli, aby Colors.RED nie było równe 0 lub cokolwiek innego poza sobą.

Czy jest problem z tym sformułowaniem? Czy istnieje lepszy sposób?


(wiem, że to pytanie jest trochę powtórzenia, ale cały previous Q/As są dość stare, a ES6 daje nam nowe możliwości.)

+2

byłoby to idealne podejście w ES6. Nie musisz go zamrażać. – Nirus

+2

@Nirus, który możesz zrobić, jeśli nie chcesz, aby został zmodyfikowany. – zerkms

+1

Zauważyłeś [tę odpowiedź] (https://stackoverflow.com/a/30058506/1048572)? – Bergi

Odpowiedz

27

Czy jest jakiś problem z to sformułowanie?

Nie widzę żadnych.

Czy istnieje lepszy sposób?

bym zwinąć dwie wypowiedzi do jednego:

const Colors = Object.freeze({ 
    RED: Symbol("red"), 
    BLUE: Symbol("blue"), 
    GREEN: Symbol("green") 
}); 

Jeśli nie podoba ci się boilerplate, jak powtarzające Symbol połączeń, można oczywiście również napisać funkcję pomocnika makeEnum który tworzy to samo z listy nazwisk.

+2

Czy tutaj nie ma problemów z rzeczywistością? –

+0

@torazaburo Masz na myśli, że kiedy kod zostanie dwukrotnie wczytany, wygeneruje różne symbole, co nie byłoby problemem z napisami? Tak, dobra rada, zrób odpowiedź :-) – Bergi

+0

Myślę, że możesz gdzieś przechowywać symbole, a następnie przypisać je, gdy zainicjujesz Enum. Czy istnieje inny sposób na ich wyjątkowość? ("Symbol.for" miałby ten sam problem.) –

0

Sprawdź także Enumify, bardzo dobrą i dobrze wyposażoną bibliotekę do podsumowań ES6.

Mam nadzieję, że to pomoże komuś.

poważaniem,

Emmanuel