2017-06-09 4 views
22

Je reconstruis un ancien projet Java en Javascript, et je me suis rendu compte qu'il n'y avait pas de bonne façon de faire des énumérations dans JS.Enums en Javascript avec ES6

Le meilleur que je peux trouver est:

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

Le const garde Colors d'être réaffectés, et le gel empêche les touches et muter des valeurs. J'utilise des symboles de sorte que Colors.RED ne soit pas égal à 0, ou toute autre chose en dehors d'elle-même.

Y at-il un problème avec cette formulation? Y a-t-il un meilleur moyen?


(Je sais que cette question est un peu une répétition, mais tous les previous Q/As sont assez vieux, et ES6 nous donne quelques nouvelles fonctionnalités.)

+2

ce serait une approche parfaite ES6. Vous n'avez pas à le geler – Nirus

+2

@Nirus vous le faites, si vous ne voulez pas qu'il soit modifié. – zerkms

+1

Avez-vous remarqué [cette réponse] (https://stackoverflow.com/a/30058506/1048572)? – Bergi

Répondre

27

Y at-il un problème avec cette formulation?

Je n'en vois pas.

Y a-t-il un meilleur moyen?

Je réunir ces deux déclarations en un seul:

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

Si vous ne l'aimez pas le passe-partout, comme les appels répétés Symbol, vous pouvez bien sûr écrire aussi une fonction d'assistance makeEnum qui crée la même chose d'une liste de noms.

+2

Y a-t-il des problèmes de domaine ici? –

+0

@torazaburo Vous voulez dire, quand le code est chargé deux fois, cela va générer des symboles différents, ce qui ne serait pas un problème avec les chaînes de caractères? Ouais, bon point, faites-en une réponse :-) – Bergi

+0

Je suppose que vous pourriez stocker les symboles quelque part, puis les assigner lorsque vous initialisez l'Enum. Y a-t-il une autre façon de les rendre uniques? ('Symbol.for' aurait le même problème.) –

0

Vérifiez également Enumify, une très bonne bibliothèque bien documentée pour ES6 enums.

J'espère que cela aidera quelqu'un.

Meilleures salutations,

Emmanuel