Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 11.09.2012, 20:58
Аватар для cyber
I am Student
Отправить личное сообщение для cyber Посмотреть профиль Найти все сообщения от cyber
 
Регистрация: 17.12.2011
Сообщений: 4,415

реализация 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...
__________________
Цитата:
Если ограничения и условия описываются как "коробка", то хитрость в том что бы найти именно коробку... Не думайте о чем то глобальном - найдите коробку.
Ответить с цитированием
  #2 (permalink)  
Старый 17.10.2018, 23:10
Интересующийся
Отправить личное сообщение для Denisko-Redisko Посмотреть профиль Найти все сообщения от Denisko-Redisko
 
Регистрация: 08.11.2009
Сообщений: 16

В 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

Последний раз редактировалось Denisko-Redisko, 17.10.2018 в 23:39.
Ответить с цитированием
  #3 (permalink)  
Старый 18.10.2018, 12:26
Аватар для Malleys
Профессор
Отправить личное сообщение для Malleys Посмотреть профиль Найти все сообщения от Malleys
 
Регистрация: 20.12.2009
Сообщений: 1,714

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 и т. д.
Ответить с цитированием
  #4 (permalink)  
Старый 18.10.2018, 20:59
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,589

Поскольку в js нет enum, то просто пользуются обычно константными свойствами объекта.
Не настолько необходим enum, чтоб его имитировать.
__________________
29375, 35
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не получается вставить код js в HTML garmoni Элементы интерфейса 3 05.09.2013 05:56
Конфликтуют js скрипты в Opera romka AJAX и COMET 2 28.05.2012 15:32
Разное оформление для посетителей с JS и без fry2 Events/DOM/Window 13 03.02.2012 17:45
JS Coaching для стартапа OlgaAyva Работа 12 27.09.2011 22:18
реализация хитрого банера с помощью js seleve Элементы интерфейса 6 17.08.2010 15:08