Структуры в Javascript

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

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?

Ответ 1

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

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

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

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

Ответ 2

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

{id: 1, speaker:"john", country: "au"}

Ответ 3

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

Ответ 4

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

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

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

Ответ 5

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

Ответ 6

Следуя за Markus answer, в более новых версиях JS (думаю, ES6) вы можете создать "struct" factory более просто, используя Функции стрелок и параметр останова следующим образом:

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

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

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