Unveränderliche Typen in Javascript

8

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?

    
Sean Thoman 13.10.2011, 19:52
quelle

6 Antworten

4

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.

    
Keith.Abramo 13.10.2011, 19:54
quelle
19

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:

%Vor%

Nun können keine neuen Eigenschaften zu einem Point2D -Objekt hinzugefügt werden und die vorhandenen Eigenschaften können nicht geändert werden:

%Vor%

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.

%Vor%

freeze und seal ist Teil von ECMAScript 5.1 hier ausführlicher beschrieben

MDN gibt an, dass freeze in unterstützt wird :

  • Firefox (Gecko) 4 (2.0)
  • Chrome 6
  • Internet Explorer 9
  • Opera 12
  • Safari 5.1

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.

    
Emil H 30.04.2014 08:15
quelle
2

Es ist in Javascript möglich, Eigenschaften-Getter und Setter zu definieren:

%Vor%

Die zugrundeliegenden Variablen, die sie modifizieren, sind jedoch änderbar.

    
Zack Bloom 13.10.2011 19:56
quelle
2
%Vor%

Da privateX und privateY nur im Gültigkeitsbereich des Konstruktors existieren, können sie nur durch die im Konstruktor definierten Funktionen (getX, getY) aufgerufen werden.

    
Scott A 13.10.2011 20:19
quelle
0

Es gibt jetzt ein neues javascript reserviertes Wort const . const erstellt Laufzeitkonstanten, die unveränderlich sind.

Hinweis: const rendert Objekte oder Arrays NICHT als unveränderlich.

Sie können irgendwie unveränderlich sein, indem Sie Object.freeze verwenden, um Mutationen von Objekten zu verhindern.

Ссылка Ссылка

DEMO

    
Fresheyeball 04.04.2014 16:16
quelle
-1

Es kann hilfreich sein, einige ES2015 in den Mix zu werfen:

%Vor%     
kon.simeonov 11.03.2017 10:11
quelle

Tags und Links