реализация enum в js
В С# есть тип данных enum который нужен для создания перечислений, в js слово enum за резервировано но такой функции я так понял в js нету и решается эта проблема подобным кодом
function _enum_ (_name,Elems) {
var elem,value;
window[_name] = {};
for (var i = Elems.length;i--;) {
elem = Elems[i];
value = elem.replace(/\s/g,'').split('=');
window[_name][value[0]] ={
value: value[0],
int:value[1] | i,
toString: function () {
return this.value;
}
};
}
}
_enum_(
'WeekDays',
['Monday = 20', 'Tuesday', 'Wednesday', 'Thursday', 'Friday' , 'Saturday', 'Sunday']);
alert(WeekDays.Tuesday);
Вопрос в том , я плохо искал или и в правду нужно это реализовать вручную? Просто не могу понять ситуацию в js c enum... |
В es6 возможен такой простой вариант:
// Library:
const enumerable = [];
enumerable[Symbol.iterator] = () => ({
next: () => ({
done: false,
value: Symbol()
})
});
// Code:
const [
ntAnPlusB,
ntAtrule,
ntAtrulePrelude,
ntAttributeSelector,
ntBlock,
ntBrackets,
ntCDC,
ntCDO,
ntClassSelector,
ntCombinator,
ntComment,
ntDeclaration,
ntDeclarationList,
ntDimension,
ntFunction,
ntHexColor,
ntIdentifier,
ntIdSelector,
ntMediaFeature,
ntMediaQuery,
ntMediaQueryList,
ntNth,
ntNumber,
ntOperator,
ntParentheses,
ntPercentage,
ntPseudoClassSelector,
ntPseudoElementSelector,
ntRatio,
ntRaw,
ntRule,
ntSelector,
ntSelectorList,
ntString,
ntStyleSheet,
ntTypeSelector,
ntUnicodeRange,
ntUrl,
ntValue,
ntWhiteSpace
] = enumerable;
document.writeln(String(ntAnPlusB))
document.writeln(String(ntAtrule))
document.writeln(String(ntAtrulePrelude))
document.writeln(String(ntAttributeSelector))
document.writeln(String(ntBlock))
document.writeln(String(ntBrackets))
document.writeln(String(ntCDC))
document.writeln(String(ntCDO))
document.writeln(String(ntClassSelector))
document.writeln(String(ntCombinator))
document.writeln(String(ntComment))
document.writeln(String(ntDeclaration))
document.writeln(String(ntDeclarationList))
document.writeln(String(ntDimension))
document.writeln(String(ntFunction))
document.writeln(String(ntHexColor))
document.writeln(String(ntIdentifier))
document.writeln(String(ntIdSelector))
document.writeln(String(ntMediaFeature))
document.writeln(String(ntMediaQuery))
document.writeln(String(ntMediaQueryList))
document.writeln(String(ntNth))
document.writeln(String(ntNumber))
document.writeln(String(ntOperator))
document.writeln(String(ntParentheses))
document.writeln(String(ntPercentage))
document.writeln(String(ntPseudoClassSelector))
document.writeln(String(ntPseudoElementSelector))
document.writeln(String(ntRatio))
document.writeln(String(ntRaw))
document.writeln(String(ntRule))
document.writeln(String(ntSelector))
document.writeln(String(ntSelectorList))
document.writeln(String(ntString))
document.writeln(String(ntStyleSheet))
document.writeln(String(ntTypeSelector))
document.writeln(String(ntUnicodeRange))
document.writeln(String(ntUrl))
document.writeln(String(ntValue))
document.writeln(String(ntWhiteSpace))
document.writeln('—'.repeat(20))
document.writeln(ntAnPlusB === ntAnPlusB)
document.writeln(ntAtrule === ntAnPlusB)
document.writeln(ntAtrulePrelude === ntAnPlusB)
document.writeln(ntAttributeSelector === ntAnPlusB)
document.writeln(ntBlock === ntAnPlusB)
document.writeln(ntBrackets === ntAnPlusB)
document.writeln(ntCDC === ntAnPlusB)
Здесь, enumerable — наш объект, содержащий итератор, который на каждый вызов возвращает новый уникальный Symbol. В es6 возможно множественное присваивание, например, такое: var [varName1, varName2] = ["value1", "value2"] Вот эти две возможности es6 и позволяют создать такую маленькую и лаконичную реализацию enum. Минус такого подхода — не самая удобная отладка, так как, в данном случае, при создании символов не указывается никакого значения, и они хоть и уникальные, но при преобразовании в строку будут выглядеть одинаково: Symbol(). Можете сами почитать про символы (они очень быстры, идеальное решение для enum), и реализовать свой вариант, например такой:
const enumerable = names =>
names.map(name => Symbol(name));
;
const types = enumerable([
"AnPlusB",
"Atrule",
"AtrulePrelude",
"AttributeSelector",
"Block",
"Brackets",
"CDC",
"CDO",
"ClassSelector",
"Combinator",
"Comment",
"Declaration",
"DeclarationList",
"Dimension",
"Function",
"HexColor",
"Identifier",
"IdSelector",
"MediaFeature",
"MediaQuery",
"MediaQueryList",
"Nth",
"Number",
"Operator",
"Parentheses",
"Percentage",
"PseudoClassSelector",
"PseudoElementSelector",
"Ratio",
"Raw",
"Rule",
"Selector",
"SelectorList",
"String",
"StyleSheet",
"TypeSelector",
"UnicodeRange",
"Url",
"Value",
"WhiteSpace"
]);
for (let [key, val] of Object.entries(types)) {
document.writeln(`${key} => ${val.toString()}`)
}
https://codepen.io/DenVdmj/pen/MBydVQ https://codepen.io/DenVdmj/pen/RBamza |
function Enum([definition]) {
return Object.freeze(
definition
.trim()
.split(/\s+/)
.reduce((m, p) => ({
...m,
[p]: Symbol(p),
__proto__: null
}), {})
);
}
// Примеры
const Color = Enum`
RED
GREEN
BLUE
`;
const Cardsuits = Enum`
CLUBS
DIAMONDS
HEARTS
SPADES
`;
console.log(Color, Cardsuits);
// Используется так: Color.RED и т. д.
|
Поскольку в js нет enum, то просто пользуются обычно константными свойствами объекта.
Не настолько необходим enum, чтоб его имитировать. |
| Часовой пояс GMT +3, время: 18:12. |