Создание объекта с константами/перечислителями/битовой картой с ключами, указанными в виде строки, массива, объекта или аргументов.
npm install constjs
var ConstJs = require('constjs');
var Colors = ConstJs.enum("синий красный");
var myColor = Colors.синий;
console.log(myColor.isСиний()); // выводит true
console.log(myColor.is('синий')); // выводит true
console.log(myColor.is('СИНИЙ')); // выводит true
console.log(myColor.is(0)); // выводит true
console.log(myColor.is(Colors.синий)); // выводит true
console.log(myColor.isКрасный()); // выводит false
console.log(myColor.is('красный')); // выводит false
console.log(myColor._id); // выводит синий
console.log(myColor.name()); // выводит синий
console.log(myColor.toString()); // выводит синий
// Обратите внимание, что используется CamelCase для генерации методов isXxx()
var AppMode = ConstJs.enum('РЕГИСТРАЦИЯ, ВХОД, ЗАБЫТ_ПАРОЛЬ');
var curMode = AppMode.ВХОД;
console.log(curMode.isВход()); // выводит true
console.log(curMode.isРегистрация()); // выводит false
console.log(curMode.isЗабытПароль()); // выводит false
Добавление методов к элементам перечисления может быть очень полезным, но существует несколько серьёзных проблем при использовании этого подхода. Как только вы сериализируете своё перечисление в строку формата JSON и парсите её обратно, вы теряете все методы и внезапно ваш код перестаёт работать. К счастью, constjs
предоставляет способ unJSON()
для решения этой проблемы:```javascript
var ConstJs = require('constjs');
...
var Colors = ConstJs.enum('RED, GREEN, BLUE'); ...
var myData = { name: 'blah blah', color: Colors.RED }; console.log(myData.color.isRED()); // выводит: true ...
var myDataStr = JSON.stringify(myData); ...
myData = JSON.parse(myDataStr); // console.log(myData.color.isRED()); // выброс исключения здесь myData = ConstJs.unJSON(myData); // или myData = ConstJs.unJSON(JSON.parse(myDataStr)); эффект тот же console.log(myData.color.isRED()); // выводит: true
Однако использование функции `unJSON` имеет свои затраты, например, ваша строка JSON будет содержать дополнительные данные для поддержки десериализации. Если вы уверены, что вам не требуется десериализация данных вашего перечисления, `constjs` предоставляет возможность создания более легковесных данных перечисления. Вместо
```javascript
var Colors = ConstJs.enum('Red, Green, Blue');
вы используете enum.transient
:
var Colors = ConstJs.enum.transient('Red, Green, Blue');
или используете псевдоним enum.lite
:
var Colors = ConstJs.enum.lite('Red, Green, Blue');
Для сравнения сгенерированных данных:
var Colors = ConstJs.enum('Red, Green, Blue');
var LiteColors = ConstJs.enum.lite('Red, Green, Blue');
var myColor = Colors.Red, myLiteColor = LiteColors.Red;
console.log({myColor: myColor, myLiteColor: myLiteColor});
Вы должны увидеть что-то вроде:
{
myColor: {_id: 'Red', _seq: 0, _kl: ['Red', 'Green', 'Blue']},
myLiteColor: {_id: 'Red', _seq: 0}
}
И после вызова unJSON
для myLiteColor
, вы обнаружите, что методы isRed()
, isGreen()
и isBlue()
больше отсутствуют. Однако вы все еще можете использовать методы name()
, toString()
и is()
для объекта myColor
после unJSON()
.
...
var s = JSON.stringify(myLiteColor);
var c = ConstJs.unJSON(s);
console.log(c.isRed); // вывод: undefined
console.log(c.name()); // вывод: 'Red'
console.log(c.is('Red')); // вывод: true
```
### Строковые константы
```javascript
var ConstJs = require('constjs');
var Weekdays = ConstJs.const("Mon, Tue, Wed");
console.log(Weekdays); // вывод {Mon: 'Mon', Tue: 'Tue', Wed: 'Wed'}
var today = Weekdays.Wed;
console.log(today); // вывод: 'Wed';
```
### Битовая карта
```javascript
var ConstJs = require('constjs');
var ColorFlags = ConstJs.bitmap("blue red");
console.log(ColorFlags.blue); // вывод false
var StyleFlags = ConstJs.bitmap(true, "rustic model minimalist");
console.log(StyleFlags.rustic); // вывод true
var CityFlags = ConstJs.bitmap({Chengdu: true, Sydney: false});
console.log(CityFlags.Chengdu); // вывод true
console.log(CityFlags.Sydney); // вывод false
var DayFlags = ConstJs.bitmap(true, {Mon: false, Tue: true});
console.log(DayFlags.Mon); // вывод false. Значение по умолчанию не переопределяется указанным значением, если тип — логический
```
### Вариации входных данных
Вместо строки ключей, разделённой вышеуказанными разделителями, можно использовать две других вариации входных данных для указания ключей:
```javascript
var ConstJs = require('constjs');
// использование массива строк для указания ключей
var Color = ConstJs.enum(["blue", "red"]);
var myColor = Color.blue;
```// использование массива аргументов для указания ключей
var BuildTool = ConstJs.enum("gulp", "grunt");
var myTool = BuildTool.gulp;
// использование объекта для указания ключей
var WeekDay = ConstJs.enum({
Monday: null,
Tuesday: null
});
var myDay = WeekDay.Monday;
Запросы на ввод поддерживаются всеми тремя генераторами: `enum`, `const` и `bitmap`
```
Корректировка:
```markdown
```javascript
...
var s = JSON.stringify(myLiteColor);
var c = ConstJs.unJSON(s);
console.log(c.isRed); // вывод: undefined
console.log(c.name()); // вывод: 'Red'
console.log(c.is('Red')); // вывод: true
```
### Строковые константы
```javascript
var ConstJs = require('constjs');
var Weekdays = ConstJs.const("Mon, Tue, Wed");
console.log(Weekdays); // вывод {Mon: 'Mon', Tue: 'Tue', Wed: 'Wed'}
var today = Weekdays.Wed;
console.log(today); // вывод: 'Wed';
```
### Битовая карта
```javascript
var ConstJs = require('constjs');
var ColorFlags = ConstJs.bitmap("blue red");
console.log(ColorFlags.blue); // вывод false
var StyleFlags = ConstJs.bitmap(true, "rustic model minimalist");
console.log(StyleFlags.rustic); // вывод true
var CityFlags = ConstJs.bitmap({Chengdu: true, Sydney: false});
console.log(CityFlags.Chengdu); // вывод true
console.log(CityFlags.Sydney); // вывод false
var DayFlags = ConstJs.bitmap(true, {Mon: false, Tue: true});
console.log(DayFlags.Mon); // вывод false. Значение по умолчанию не переопределяется указанным значением, если тип — логический
```
### Вариации входных данных
Вместо строки ключей, разделённой вышеуказанными разделителями, можно использовать две других вариации входных данных для указания ключей:
```javascript
var ConstJs = require('constjs');
// использование массива строк для указания ключей
var Color = ConstJs.enum(["blue", "red"]);
var myColor = Color.blue;
// использование массива аргументов для указания ключей
var BuildTool = ConstJs.enum("gulp", "grunt");
var myTool = BuildTool.gulp;
// использование объекта для указания ключей
var WeekDay = ConstJs.enum({
Monday: null,
Tuesday: null
});
var myDay = WeekDay.Monday;
Запросы на ввод поддерживаются всеми тремя генераторами: `enum`, `const` и `bitmap`.
```
```## Нечувствительность к изменениям
`constjs` пытается использовать `Object.freeze()` для того чтобы сделать объект enum/const неизменяемым:
```javascript
var ConstJs = require('constjs');
// используйте массив строк для указания ключей
var Color = ConstJs.enum(["blue", "red"]);
Color.blue = 'blue';
console.log(Color.blue); // вывод {_id: 'blue', ...}
var WeekDay = ConstJs.const(['Mon', 'Tue']);
WeekDay.Mon = false;
console.log(WeekDay.Mon); // вывод: 'Mon'
WeekDay.Wed = 'Wed';
console.log(WeekDay.Wed); // вывод: 'undefined'
```
Для объекта `bitmap` `constjs` использует `Object.seal()`, чтобы установить или сбросить флаг. Однако это всё ещё не позволяет удалять или добавлять свойства:
```javascript
var ConstJs = require('constjs');
var ColorFlags = ConstJs.bitmap(['blue', 'red']);
ColorFlags.blue = true;
console.log(ColorFlags.blue); // вывод: true
ColorFlags.brown = false;
console.log(ColorFlags.brown); // вывод: 'undefined'
```
Однако `constjs` предоставляет функцию `immutable` для `bitmap`, что гарантирует, что данные, возвращаемые этой функцией, полностью заморожены:
```javascript
var ConstJs = require('constjs');
var ColorFlags = ConstJs.bitmap.immutable(['blue', 'red']);
ColorFlags.blue = true;
console.log(ColorFlags.blue); // вывод: false
ColorFlags.brown = false;
console.log(ColorFlags.brown); // вывод: 'undefined'
```
Зависимости
-------------
* `lodash`
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )