Estruturas em 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')
];
Mas pergunto-me se isto é uma boa prática. Existem outras formas, melhores de simular uma estrutura em Javascript?
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
Uso sempre literais de objectos
{id: 1, speaker:"john", country: "au"}
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.
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.Uso objectos estilo JSON para estruturas Burras (sem funções de membro).
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
É 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