2017-06-09 44 views
22

我正在用Javascript重建一个旧Java项目,并意识到在JS中没有好的方法来执行枚举。用ES6在JavaScript中枚举

我能想出的最好的是:

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

const保持Colors被重新分配,并冻结它可以防止变异的键和值。我正在使用符号,因此Colors.RED不等于0,或除本身以外的任何其他内容。

这个配方有问题吗?有没有更好的办法?


(我知道这个问题有点重复的,但所有的previous Q/As都相当老了,ES6为我们提供了一些新的功能。)

+2

这将是ES6一个完美的方法。你不必冻结它 – Nirus

+2

@Nirus你做的,如果你不希望它被修改。 – zerkms

+1

你有没有注意到[这个答案](https://stackoverflow.com/a/30058506/1048572)? – Bergi

回答

27

有一个问题这个表述?

我没有看到任何。

有没有更好的方法?

我的两个语句折叠成一个:

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

如果你不喜欢的样板,如反复Symbol电话,你当然也可以写一个辅助函数makeEnum创建名字列表中的同一件事。

+2

这里没有领域问题吗? –

+0

@torazaburo你的意思是,当代码加载两次时,它会产生不同的符号,这不会是一个字符串问题?是的,好点,让它成为答案:-) – Bergi

+0

我想你可以在某处存储符号,然后在初始化枚举时赋予它们。是否有另一种方法使它们独一无二? ('Symbol.for'会有同样的问题。) –

0

另外检查Enumify,这是一个很好的功能强大的ES6枚举库。

希望这会帮助别人。

最好的问候,

灵光