Strukturen in Javascript

Lesezeit: 6 Minuten

Benutzer-Avatar
Nickf

Früher habe ich, wenn ich eine Reihe verwandter Variablen speichern musste, eine Klasse erstellt.

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

Aber ich frage mich, ob dies eine gute Praxis ist. Gibt es noch andere, besser Möglichkeiten, eine Struktur in JavaScript zu simulieren?

  • Im Code ist ein Tippfehler – “spkr”

    – Nathan B

    27. Dezember 2020 um 18:19 Uhr

  • Geht es Ihnen um die Speichereffizienz? Oder nur Typprüfung? Typoskript ist heute definitiv der Weg zur Typprüfung. Für Speichereffizienz suche ich noch! stackoverflow.com/questions/1248302/…

    – Ciro Santilli Путлер Капут 六四事

    28. April um 12:42 Uhr

Benutzer-Avatar
Markus Jarderot

Der einzige Unterschied zwischen Objektliteralen und konstruierten Objekten sind die vom Prototyp geerbten Eigenschaften.

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

Sie könnten eine Struct-Factory erstellen.

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

  • Ich mag diesen Ansatz, aber seien Sie vorsichtig, wenn Sie den Closure-Compiler verwenden. Auf das Tupel kann in diesem Fall nur als String zugegriffen werden, da die Eigenschaften umbenannt werden. (Zumindest im erweiterten Modus)

    – Kap

    24. März 2016 um 8:15 Uhr

  • Ich war neugierig auf die Effizienz dieser Methode gegenüber den Objektliteralen.

    – c0degeas

    5. Juli 2019 um 13:22 Uhr

  • Es ist möglicherweise auch möglich, die JS-Klasse zu verwenden.

    – SphynxTech

    4. April 2020 um 12:58 Uhr

Ich verwende immer Objektliterale

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

  • würde das die Wartung nicht viel schwieriger machen (sollten Sie in Zukunft ein neues Feld hinzufügen wollen) und auch viel mehr Code (jedes Mal “id”, “speaker”, “country” neu eingeben)?

    – Nickf

    2. Februar 2009 um 6:53 Uhr

  • Es ist genauso wartbar wie eine Lösung mit Klassen, da sich JavaScript nicht um die Anzahl der Argumente kümmert, mit denen Sie die Funktion aufrufen. Das erneute Eintippen ist kein Problem, wenn Sie die richtigen Tools wie Emacs verwenden. Und Sie können sehen, was gleich was ist, was Fehler wie das Vertauschen von Argumenten obsolet macht.

    – vava

    2. Februar 2009 um 7:22 Uhr

  • Aber der größte Vorteil ist, dass Sie weniger Code schreiben würden und es sauberer wäre 🙂

    – vava

    2. Februar 2009 um 7:24 Uhr

  • Das erneute Eingeben von @vava ist immer noch ein Problem, da es mehr Sprünge gibt als das Kopieren des neuen Archetyps ___ ( , , , ). Außerdem fehlt die Lesbarkeit. Sobald Sie sich an das Codieren gewöhnt haben, new READABLE_PART(ignore everything in here) wird im Gegensatz zu sehr scannbar und selbstdokumentierend {read: "ignore", everything: "ignore", in: "ignore", here: "ignore"} // and then come up with READABLE_PART in deinem Kopf. Die erste Version ist lesbar, während schnell hochgeblättert wird. Die zweite, Sie refaktorisieren in Strukturen, nur um sie zu verstehen.

    – Chris

    4. April 2018 um 15:28 Uhr


Benutzer-Avatar
Mario

Das eigentliche Problem besteht darin, dass Strukturen in einer Sprache Werttypen und keine Referenztypen sein sollen. Die vorgeschlagenen Antworten schlagen vor, Objekte (die Referenztypen sind) anstelle von Strukturen zu verwenden. Dies kann zwar seinen Zweck erfüllen, umgeht jedoch den Punkt, dass ein Programmierer tatsächlich die Vorteile der Verwendung von Werttypen (wie einem Primitiv) anstelle eines Referenztyps nutzen möchte. Werttypen sollten beispielsweise keine Speicherverluste verursachen.

EDIT: Gibt es ein Vorschlag in Arbeit um diesen Zweck abzudecken.

//today
var obj = {fname: "Kris", lname: "Kringle"}; //vanilla object
var gifts = ["truck", "doll", "slime"]; //vanilla array

//records and tuples - not possible today
var obj = #{fname: "Buddy", lname: "Hobbs"};
var skills = #["phone calls", "basketball", "gum recycling"];

Ich denke, das Erstellen einer Klasse zum Simulieren von C-ähnlichen Strukturen, wie Sie es getan haben, ist das Richtige Beste Weg.

Es ist eine großartige Möglichkeit, zusammengehörige Daten zu gruppieren und die Übergabe von Parametern an Funktionen zu vereinfachen. Ich würde auch argumentieren, dass eine JavaScript-Klasse eher einer C++-Struktur als einer C++-Klasse ähnelt, wenn man bedenkt, dass zusätzlicher Aufwand benötigt, um reale objektorientierte Features zu simulieren.

Ich habe festgestellt, dass der Versuch, JavaScript einer anderen Sprache ähnlicher zu machen, schnell kompliziert wird, aber ich unterstütze die Verwendung von JavaScript-Klassen als funktionslose Strukturen voll und ganz.

Benutzer-Avatar
Tippfehler

Nach der Antwort von Markus können Sie in neueren Versionen von JS (ES6, glaube ich) eine ‘struct’ Factory einfacher erstellen Pfeilfunktionen und Ruheparameter so:

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

Das Ergebnis dieser Ausführung ist:

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

Sie können es dem Namedtuple von Python ähneln lassen:

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

Und die Ergebnisse:

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

  • Es sieht aus wie die Struktur in C/C++ und anderen Sprachen, ist es aber tatsächlich nicht – die , Eigenschaften in Objekten sind nicht garantiert wie folgt beschrieben: Definition eines Objekts aus ECMAScript, dritte Ausgabe (pdf): 4.3.3 Objekt Ein Objekt ist ein Mitglied des Typs Object. Es ist eine ungeordnete Sammlung von Eigenschaften, von denen jede einen primitiven Wert, ein Objekt oder eine Funktion enthält. Eine in einer Eigenschaft eines Objekts gespeicherte Funktion wird als Methode bezeichnet

    – tibet

    7. Januar 2019 um 3:15 Uhr


Benutzer-Avatar
Robert Gould

Ich verwende Objekte im JSON-Stil für dumme Strukturen (keine Member-Funktionen).

  • Es sieht aus wie die Struktur in C/C++ und anderen Sprachen, ist es aber tatsächlich nicht – die , Eigenschaften in Objekten sind nicht garantiert wie folgt beschrieben: Definition eines Objekts aus ECMAScript, dritte Ausgabe (pdf): 4.3.3 Objekt Ein Objekt ist ein Mitglied des Typs Object. Es ist eine ungeordnete Sammlung von Eigenschaften, von denen jede einen primitiven Wert, ein Objekt oder eine Funktion enthält. Eine in einer Eigenschaft eines Objekts gespeicherte Funktion wird als Methode bezeichnet

    – tibet

    7. Januar 2019 um 3:15 Uhr


Benutzer-Avatar
Manuel

Es ist mehr Arbeit einzurichten, aber wenn die Wartbarkeit den einmaligen Aufwand übertrifft, dann könnte dies Ihr Fall sein.

/**
 * @class
 */
class Reference {

    /**
     * @constructs Reference
     * @param {Object} p The properties.
     * @param {String} p.class The class name.
     * @param {String} p.field The field name.
     */
    constructor(p={}) {
        this.class = p.class;
        this.field = p.field;
    }
}

Vorteile:

  • nicht an Argumentreihenfolge gebunden
  • leicht erweiterbar
  • Typ-Skript-Unterstützung:

Geben Sie hier die Bildbeschreibung ein

1256440cookie-checkStrukturen in Javascript

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy