Estruturas em Javascript

Anteriormente, quando precisava de armazenar uma série de variáveis relacionadas, criava uma classe.

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')
];
Mas pergunto-me se isto é uma boa prática. Existem outras formas, melhores de simular uma estrutura em Javascript?

Author: nickf, 2009-02-02

7 answers

A única diferença entre objectos literais e objectos construídos são as propriedades herdadas do protótipo.

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

Podias fazer uma fábrica struct.
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
 154
Author: Markus Jarderot, 2009-02-02 07:19:09

Uso sempre literais de objectos

{id: 1, speaker:"john", country: "au"}
 25
Author: vava, 2009-02-02 06:28:43

O verdadeiro problema é que as estruturas numa linguagem são supostas ser tipos de valor e não tipos de referência. As respostas propostas sugerem o uso de objetos (que são tipos de referência) no lugar de estruturas. Enquanto isso pode servir a sua finalidade, ele ignora o ponto de que um programador iria realmente querer os benefícios de usar tipos de valor (como um primitivo) em vez de tipo de referência. Tipos de valor, para um, não deve causar vazamentos de memória.

 9
Author: Mario, 2016-07-28 16:09:48

Acho que criar uma classe para simular estruturas tipo C, Como tens feito, é a melhor maneira.

É uma ótima maneira de agrupar dados relacionados e simplifica a passagem de parâmetros para funções. Eu também argumentaria que uma classe JavaScript é mais como uma estrutura C++ do que uma classe C++, considerando o esforço adicional necessário para simular características orientadas a objetos reais. Descobri que tentar tornar o JavaScript mais parecido com outra língua torna-se complicado rapidamente, mas ... Eu apoio totalmente usando classes JavaScript como estruturas sem funções.
 7
Author: peter, 2011-08-13 22:56:52

Uso objectos estilo JSON para estruturas Burras (sem funções de membro).

 2
Author: Robert Gould, 2009-02-02 06:29:00

Seguindo a resposta do Markus , nas versões mais recentes do JS (ES6, penso eu) você pode criar uma fábrica 'struct' mais simplesmente usando as funções de seta e O parâmetro de resto Assim:

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);

O resultado da execução é:

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

Você pode fazê-lo parecer semelhante ao Python's 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);

E os resultados:

[ { _name: 'Item', id: 1, speaker: 'john', country: 'au' },
  { _name: 'Item', id: 2, speaker: 'mary', country: 'us' } ]
1
john
au
 2
Author: typoerrpr, 2017-10-14 06:45:00
Fiz uma pequena biblioteca para definir o struct se trabalhares com a compatibilidade do ES6.

É um analisador JKT que poderá obter aqui o repositório de projectos O analisador JKT

Por exemplo, pode criar a sua estrutura assim

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 
 0
Author: Aditya Kresna Permana, 2018-03-08 09:57:36