Я перестраиваю старый Java-проект в Javascript и понимаю, что нет хорошего способа сделать перечисления в JS.
Лучшее, что я могу придумать, это:
const Colors = {
RED: Symbol("red"),
BLUE: Symbol("blue"),
GREEN: Symbol("green")
};
Object.freeze(Colors);
const
сохраняет Colors
от быть переназначены, и замораживание он предотвращает мутирует ключи и значения. Я использую символы, чтобы Colors.RED
не был равен 0
или что-то еще, кроме самого себя.
Есть ли проблема с этой формулировкой? Есть ли способ лучше?
(Я знаю, что этот вопрос немного повторен, но все предыдущие Q/As довольно старые, а ES6 дает нам некоторые новые возможности.)
РЕДАКТИРОВАТЬ:
Еще одно решение, которое касается проблемы сериализации, но я считаю, что все еще есть проблемы в области:
const enumValue = (name) => Object.freeze({toString: () => name});
const Colors = Object.freeze({
RED: enumValue("Colors.RED"),
BLUE: enumValue("Colors.BLUE"),
GREEN: enumValue("Colors.GREEN")
});
Используя ссылки на объекты как значения, вы получаете такое же предотвращение столкновений, как и символы.