Обновление 8 мая 2022 года:
Если вы хотите использовать его, я только что опубликовал его как пакет npm.
npm i makestruct
Что такое структура?
Структура используется для построения структур данных. Эти структуры используются для группировки связанных данных вместе.
Есть различия в том, как они работают за кулисами в зависимости от языка программирования, но самое интересное, что в JavaScript нет структур.
Когда вы хотите создать пользовательскую структуру данных в JS, вы обычно делаете одну вещь. Создание объекта.
const user = {
id: 0,
name: '',
country: '',
pets: [],
}
Но есть ли другой способ сделать это?
Давайте попробуем создать функцию для динамической генерации “структур” в JavaScript!
/**
* @constructor Generates a constructor for a given data structure
* @param {string} keys separated by a comma + whitespace. struct('id, name, age')
* @returns {constructor} Constructor for the new struct
*/
function makeStruct(keys) {
if (!keys) return null;
const k = keys.split(', ');
const count = k.length;
/** @constructor */
function constructor() {
for (let i = 0; i < count; i++) this[k[i]] = arguments[i];
}
return constructor;
}
Как это работает?
Она принимает строку, разделенную запятыми и пробелами, и генерирует конструктор для нужной вам структуры, так что теперь вы можете создавать свои объекты, используя этот динамически сгенерированный конструктор.
Использование:
const user = new makeStruct("id, name, country");
const johnny = new user(1, 'John', 'UK');
console.log(johnny.name); // john
Мы также можем назначать сложные структуры в наших свойствах!
const user = new makeStruct("id, name, country, pets");
const pepe = new user(1, 'Pepe', 'ES', ['Baxter', 'Flurfrils']);
console.log(pepe.pets); // ['Baxter', 'Flurfrils']
Или добавить одну структуру внутрь другой:
/**
* @typedef UserInfo
* @property {string} phone
* @property {number} age
* @property {string} hairColor
* @constructor
*/
/** @type {ObjectConstructor|any} */
const UserInfo = new makeStruct('phone, age, hairColor');
/** @type {UserInfo} */
const extraInfo = new UserInfo('555-777-888', 31, 'blonde');
/**
* @typedef User
* @property {number} id
* @property {string} name
* @property {string} country
* @property {UserInfo} info
* @constructor
*/
/** @type {ObjectConstructor|any} */
const User = new makeStruct('id, name, country, info');
/** @type {User} */
const John = new User(1, 'John', 'US', extraInfo);
Теперь мы можем сделать:
John.country // 'US'
John.info.phone // '555-777-888'
Ладно, ладно, в конце создается объект, но JavaScript – это объектно-ориентированный язык, как и Python и другие, так что на самом деле все является объектом.
И вы не можете сказать, что это не смешно!
Вам нравится мой контент?