Structs i Javascript

stemmer
81

Tidligere, da jeg trengte å lagre en rekke relaterte variabler, vil jeg lage en klasse.

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

Men jeg lurer på om dette er en god praksis. Er det noen andre, bedre måter å simulere en struct i Javascript?

Publisert på 02/02/2009 klokken 06:25
kilden bruker
På andre språk...                            


7 svar

stemmer
150

Den eneste forskjellen mellom objekt konstanter og konstruerte objekter er egenskapene arvet fra prototypen.

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

Du kan gjøre en struct fabrikken.

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
Svarte 02/02/2009 kl. 06:41
kilden bruker

stemmer
25

Jeg bruker alltid objekt litteraler

{id: 1, speaker:"john", country: "au"}
Svarte 02/02/2009 kl. 06:28
kilden bruker

stemmer
9

Det virkelige problemet er at strukturer i et språk er ment å være verdityper ikke referere typer. De foreslåtte svarene foreslår å bruke gjenstander (som referanse typer) i stedet for strukturer. Mens dette kan tjene sitt formål, sidesteps det punktet at en programmerer ville faktisk ønsker fordelene ved å bruke verdityper (som en primitiv) i stedet for referansetype. Verdityper, for en, bør ikke føre til minnelekkasjer.

Svarte 07/11/2012 kl. 01:37
kilden bruker

stemmer
7

Jeg tror å lage en klasse for å simulere C-lignende structs, som du har gjort, er den beste måten.

Det er en god måte å gruppere relaterte data og forenkler sende parametere til funksjoner. Jeg vil også hevde at en Javascript-klasse er mer som en C ++ struct enn en C ++ klasse, med tanke på ekstra innsats for å simulere virkelige objektorientert funksjoner.

Jeg har funnet ut at å prøve å gjøre Javascript mer som et annet språk blir komplisert fort, men jeg støtter fullt ut ved hjelp av Javascript klasser som function structs.

Svarte 13/08/2011 kl. 22:56
kilden bruker

stemmer
2

Etter Markus er svaret , i nyere versjoner av JS (ES6 tror jeg) kan du opprette en struct 'fabrikk enklere å bruke pil funksjoner og Rest Parameter som så:

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

Resultatet av å kjøre dette er:

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

Du kan gjøre det ligne Pythons 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);

Og resultatene:

[ { _name: 'Item', id: 1, speaker: 'john', country: 'au' },
  { _name: 'Item', id: 2, speaker: 'mary', country: 'us' } ]
1
john
au
Svarte 14/10/2017 kl. 05:48
kilden bruker

stemmer
2

Jeg bruker gjenstander JSON stil for dumme structs (ingen medlems funksjoner).

Svarte 02/02/2009 kl. 06:29
kilden bruker

stemmer
0

Jeg gjorde et lite bibliotek å definere struct hvis du arbeider med ES6 kompatibilitet.

Det er en JKT parser du kan kassa prosjektet depot her JKT parser

For eksempel kan du opprette din struct som dette

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 
Svarte 13/02/2018 kl. 17:15
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more