1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/greenlaw110-constjs

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

constjs

Создание объекта с константами/перечислителями/битовой картой с ключами, указанными в виде строки, массива, объекта или аргументов.

Использование

npm install constjs

Перечисление (стиль Java)

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

Добавление методов к элементам перечисления может быть очень полезным, но существует несколько серьёзных проблем при использовании этого подхода. Как только вы сериализируете своё перечисление в строку формата 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 )

Вы можете оставить комментарий после Вход в систему

Введение

В JavaScript создать Enum (как в Java), Const и Bitmap. Развернуть Свернуть
MIT
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/greenlaw110-constjs.git
git@api.gitlife.ru:oschina-mirror/greenlaw110-constjs.git
oschina-mirror
greenlaw110-constjs
greenlaw110-constjs
master