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