Структуры в Javascript - PullRequest
       26

Структуры в Javascript

94 голосов
/ 02 февраля 2009

Раньше, когда мне нужно было хранить несколько связанных переменных, я создавал класс.

function Item(id, speaker, country) {
    this.id = id;
    this.speaker = spkr;
    this.country = country;
}
var myItems = [
    new Item(1, 'john', 'au'),
    new Item(2, 'mary', 'us')
];

Но мне интересно, если это хорошая практика. Существуют ли другие лучшие способы имитации структуры в Javascript?

Ответы [ 7 ]

163 голосов
/ 02 февраля 2009

Единственное различие между литералами объекта и созданными объектами - это свойства, унаследованные от прототипа.

var o = {
  'a': 3, 'b': 4,
  'doStuff': function() {
    alert(this.a + this.b);
  }
};
o.doStuff(); // displays: 7

Вы можете создать структуру фабрики.

function makeStruct(names) {
  var names = names.split(' ');
  var count = names.length;
  function constructor() {
    for (var i = 0; i < count; i++) {
      this[names[i]] = arguments[i];
    }
  }
  return constructor;
}

var Item = makeStruct("id speaker country");
var row = new Item(1, 'john', 'au');
alert(row.speaker); // displays: john
25 голосов
/ 02 февраля 2009

Я всегда использую литералы объекта

{id: 1, speaker:"john", country: "au"}
13 голосов
/ 07 ноября 2012

Реальная проблема заключается в том, что структуры в языке должны быть типами значений, а не ссылочными типами. Предлагаемые ответы предлагают использовать объекты (которые являются ссылочными типами) вместо структур. Хотя это может служить своей цели, оно обходит стороной тот факт, что программист на самом деле хотел бы получить преимущества от использования типов значений (например, примитивов) вместо ссылочного типа. Типы значений, например, не должны вызывать утечки памяти.

7 голосов
/ 14 августа 2011

Я думаю, что создание класса для имитации C-подобных структур, как вы это делали, - это лучший способ.

Это отличный способ группировать связанные данные и упрощает передачу параметров в функции. Я также утверждаю, что класс JavaScript больше похож на структуру C ++, чем класс C ++, учитывая дополнительные усилия , необходимые для моделирования реальных объектно-ориентированных функций.

Я обнаружил, что попытка сделать JavaScript более похожим на другой язык быстро усложняется, но я полностью поддерживаю использование классов JavaScript как бесполезных структур.

3 голосов
/ 14 октября 2017

После ответа Маркуса в более новых версиях JS (я думаю, ES6) вы можете создать фабрику 'struct' более просто, используя Функции стрелок и Параметр отдыха вот так:

const Struct = (...keys) => ((...v) => keys.reduce((o, k, i) => {o[k] = v[i]; return o} , {}))
const Item = Struct('id', 'speaker', 'country')
var myItems = [
    Item(1, 'john', 'au'),
    Item(2, 'mary', 'us')
];

console.log(myItems);
console.log(myItems[0].id);
console.log(myItems[0].speaker);
console.log(myItems[0].country);

Результат выполнения этого:

[ { id: 1, speaker: 'john', country: 'au' },
  { id: 2, speaker: 'mary', country: 'us' } ]
1
john
au

Вы можете сделать его похожим на namedtuple Python:

const NamedStruct = (name, ...keys) => ((...v) => keys.reduce((o, k, i) => {o[k] = v[i]; return o} , {_name: name}))
const Item = NamedStruct('Item', 'id', 'speaker', 'country')
var myItems = [
    Item(1, 'john', 'au'),
    Item(2, 'mary', 'us')
];

console.log(myItems);
console.log(myItems[0].id);
console.log(myItems[0].speaker);
console.log(myItems[0].country);

И результаты:

[ { _name: 'Item', id: 1, speaker: 'john', country: 'au' },
  { _name: 'Item', id: 2, speaker: 'mary', country: 'us' } ]
1
john
au
2 голосов
/ 02 февраля 2009

Я использую объекты в стиле JSON для немых структур (без функций-членов).

0 голосов
/ 13 февраля 2018

Я создал небольшую библиотеку для определения структуры, если вы работаете с совместимостью с ES6.

Это анализатор JKT, вы можете проверить репозиторий проекта здесь Анализатор JKT

Например, вы можете создать свою структуру следующим образом:

const Person = jkt`
    name: String
    age: Number
`

const someVar = Person({ name: "Aditya", age: "26" })

someVar.name // print "Aditya"
someVar.age // print 26 (integer)

someVar.toJSON() // produce json object with defined schema 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...