Unterschied zwischen Einfrieren und Versiegeln


163

Ich habe gerade von den JavaScript-Methoden freezeund gehört seal, mit denen jedes Objekt unveränderlich gemacht werden kann.

Hier ist ein kurzes Beispiel für die Verwendung:

var o1 = {}, o2 = {};
Object.freeze(o2);

o1["a"] = "worked";
o2["a"] = "worked";

alert(o1["a"]);   //prints "worked"
alert(o2["a"]);   //prints "undefined"

Was ist der Unterschied zwischen freezeund seal? Können sie die Leistung steigern?


6
Nur eine Anmerkung für jeden, der sich diese Frage ansieht, die akzeptierte Antwort ist sachlich falsch. Die Antwort von @ tungd ist richtig.
Björn

2
Ein weiterer Hinweis gibt es Object.preventExtensionszusätzlich zu Object.sealund Object.freeze. Object.preventExtensionsverhindert nur, dass einem Objekt neue Elemente hinzugefügt werden. Sie können die Werte von Eigenschaften für Objekte löschen, konfigurieren und ändern, deren Erweiterbarkeit deaktiviert wurde Object.preventExtensions.
Björn

Antworten:


192

Object.seal

  • Es verhindert das Hinzufügen und / oder Entfernen von Eigenschaften zum versiegelten Objekt. using deletegibt false zurück
  • Es macht jede vorhandene Eigenschaft nicht konfigurierbar : Sie können nicht von 'Datendeskriptoren' in 'Accessor-Deskriptoren' (und umgekehrt) konvertiert werden, und kein Attribut von Accessor-Deskriptoren kann überhaupt geändert werden (während Datendeskriptoren ihr writableAttribut ändern können und ihr valueAttribut wenn writeablewahr ist).
  • Kann ein TypeErrorauslösen, wenn versucht wird, den Wert des versiegelten Objekts selbst zu ändern (am häufigsten im strengen Modus ).

Object.freeze

  • Genau das Object.seal, plus:
  • Es verhindert, dass vorhandene Eigenschaften geändert werden

Keiner von beiden betrifft 'tiefe' / Enkelobjekte. Wenn z. B. objeingefroren ist, obj.elkann es nicht neu zugewiesen werden, aber der Wert von obj.elkann geändert werden, z obj.el.id. B. kann geändert werden.


Performance:

Das Versiegeln oder Einfrieren eines Objekts kann je nach Browser die Aufzählungsgeschwindigkeit beeinträchtigen:

  • Firefox: Die Aufzählungsleistung wird nicht beeinträchtigt
  • IE: Die Auswirkungen auf die Aufzählungsleistung sind vernachlässigbar
  • Chrome: Die Aufzählungsleistung ist bei versiegelten oder eingefrorenen Objekten schneller
  • Safari: Versiegelte oder gefrorene Objekte zählen 92% langsamer (Stand 2014)

Tests: Versiegelte Objekte , Gefrorene Objekte .


2
Können Sie darüber sprechen, warum wir diese Methoden jemals anwenden würden? Nur weil wir können?
Alan Dong

3
Ich denke, dass sie in Zukunft häufig (wenn sie richtig optimiert werden) bei der Entwicklung einer Bibliothek / eines Frameworks verwendet werden. Sie können damit verhindern, dass der Benutzer (auch unbeabsichtigt) Ihren Code beschädigt (und wie in der Antwort angegeben, sollten Optimierungen zu erheblichen Geschwindigkeitsverbesserungen führen). Aber das ist reine Spekulation :)
Niccolò Campolungo

2
Diese Antwort weist viele sachliche Fehler auf. Zum einen können sealauch vorhandene Eigenschaften nicht konfiguriert werden, siehe jsfiddle.net/btipling/6m743whn Nummer 2, die Sie weiterhin bearbeiten können, dh die Werte vorhandener Eigenschaften für ein versiegeltes Objekt ändern.
Björn

8
Gefrorene und versiegelte FWIW-Objekte sind jetzt schneller als ihre nicht gefrorenen und nicht versiegelten Gegenstücke in Chrome Canary v43.0.2317.0.
Lambda

2
@AlanDong Etwas spät, aber hier ist der Grund, warum Sie ein Objekt sperren möchten. Eine der Funktionen von JavaScript besteht darin, dass Sie jederzeit eine Eigenschaft hinzufügen können. Sie können dies auch versehentlich tun , indem Sie falsch tippen. Viele meiner Schüler haben versucht, einen Ereignishandler namens onClickoder hinzuzufügen, onlickund sich gefragt, warum dies nicht funktioniert. Wenn JavaScript einen Fehler auslöst, ist dies eine Sache weniger, die falsch ist. Zweitens können Sie so konstante Eigenschaften für ein Objekt implementieren, die Änderungen verhindern. Dies ist besonders nützlich bei Objektmethoden.
Manngo
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.