Es scheint mir, dass unveränderliche Typen in Javascript unmöglich sind, oder kennt jemand irgendwelche Tricks, um sie zu erstellen? Ist es eine gute oder schlechte Praxis?
Zum Beispiel so etwas wie
%Vor%Was natürlich nicht wirklich unveränderbar ist, aber wenn es entweder 1) gut dokumentiert wäre, dass die Eigenschaften 'x' und 'y' Getter-Funktionen sind oder 2) eine Art Warnung bei der Validierung für Unveränderlichkeit dann warnt könnte als de-facto unveränderliches Objekt handeln.
Gedanken?
Wenn Sie sich keine Sorgen um ältere Browser machen müssen, können Sie in Object.defineProperty
Abgesehen davon denke ich nicht, dass es eine große Option gibt, da jede Funktion / Eigenschaft eines Objekts an irgendeiner Stelle in JavaScript neu definiert werden kann.
Sie können Object.freeze(o);
verwenden, um ein Objekt in neuen Browsern unveränderlich zu machen.
Das Point2D
könnte also so implementiert werden:
Nun können keine neuen Eigenschaften zu einem Point2D
-Objekt hinzugefügt werden und die vorhandenen Eigenschaften können nicht geändert werden:
Wenn Sie das Objekt nur sperren möchten, damit keine neuen Eigenschaften hinzugefügt werden, können Sie stattdessen Object.seal(o);
verwenden. Dadurch können Sie vorhandene Eigenschaften ändern, aber keine neuen hinzufügen.
freeze
und seal
ist Teil von ECMAScript 5.1 hier ausführlicher beschrieben
MDN gibt an, dass freeze
in unterstützt wird :
Alternativ könnten Sie einen funktionelleren Codierungsstil verwenden:
%Vor%Die Verwendung wäre dann wie folgt:
%Vor% Ich kenne keine Möglichkeit, die "Eigenschaften" x
und y
mit dieser Vorgehensweise zu ändern, da sie an den Geltungsbereich der Funktion Point2D
gebunden sind. Dieser Ansatz wird normalerweise nicht in JavaScript gesehen (soweit ich weiß), ist aber ähnlich wie Message Passing / OO in zum Beispiel Schema erreicht werden kann.
Es ist in Javascript möglich, Eigenschaften-Getter und Setter zu definieren:
%Vor%Die zugrundeliegenden Variablen, die sie modifizieren, sind jedoch änderbar.
Es gibt jetzt ein neues javascript reserviertes Wort const
. const
erstellt Laufzeitkonstanten, die unveränderlich sind.
Sie können irgendwie unveränderlich sein, indem Sie Object.freeze
verwenden, um Mutationen von Objekten zu verhindern.
Es kann hilfreich sein, einige ES2015 in den Mix zu werfen:
%Vor%Tags und Links javascript oop types immutability