Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten.Erfahre mehr über dieses Experiment.
Object.freeze()
Baseline Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since Juli 2015.
Die statische MethodeObject.freeze()friert ein Objekt ein. Das Einfrieren eines Objektsverhindert Erweiterungen und macht vorhandene Eigenschaften nicht beschreibbar und nicht konfigurierbar. Ein eingefrorenes Objekt kann nicht mehr verändert werden: Neue Eigenschaften können nicht hinzugefügt, vorhandene Eigenschaften nicht entfernt werden; ihre Aufzählbarkeit, Konfigurierbarkeit, Beschreibbarkeit oder ihr Wert können nicht geändert werden, und das Prototyp-Objekt kann nicht neu zugewiesen werden.freeze() gibt das gleiche Objekt zurück, das übergeben wurde.
Das Einfrieren eines Objekts ist das höchste Integritätslevel, das JavaScript bietet.
In diesem Artikel
Probieren Sie es aus
const obj = { prop: 42,};Object.freeze(obj);obj.prop = 33;// Throws an error in strict modeconsole.log(obj.prop);// Expected output: 42Syntax
Object.freeze(obj)Parameter
objDas einzufrierende Objekt.
Rückgabewert
Das Objekt, das an die Funktion übergeben wurde.
Beschreibung
Das Einfrieren eines Objekts entspricht demVerhindern von Erweiterungen und dann dem Ändern aller vorhandenenEigenschafts-Deklaratoren, wobeiconfigurable auffalse gesetzt wird — und bei Dateneigenschaften auchwritable auffalse. Nichts kann zum oder vom Eigenschaftensatz eines eingefrorenen Objekts hinzugefügt oder entfernt werden. Jeder Versuch dies zu tun, wird scheitern, entweder stillschweigend oder durch das Werfen einerTypeError-Ausnahme (meistens, aber nicht ausschließlich, imStrict Mode).
Bei Daten-Eigenschaften eines eingefrorenen Objekts können ihre Werte nicht geändert werden, da die Attributewritable undconfigurable auffalse gesetzt sind. Accessor-Eigenschaften (Getter und Setter) funktionieren gleich — der von einem Getter zurückgegebene Eigenschaftswert kann sich weiterhin ändern, und der Setter kann weiterhin aufgerufen werden, ohne Fehler zu werfen, wenn die Eigenschaft gesetzt wird. Beachten Sie, dass Werte, die Objekte sind, weiterhin geändert werden können, es sei denn, sie sind ebenfalls eingefroren. Als Objekt kann ein Array eingefroren werden; nach dem Einfrieren können seine Elemente nicht mehr geändert und keine Elemente hinzugefügt oder entfernt werden.
Private Elemente sind keine Eigenschaften und haben kein Konzept von Eigenschafts-Deklaratoren. Das Einfrieren eines Objekts mit privaten Elementen verhindert nicht, dass die Werte dieser privaten Elemente geändert werden. (Das Einfrieren von Objekten wird normalerweise als Sicherheitsmaßnahme gegen externen Code verstanden, aber externer Code kann private Elemente sowieso nicht zugreifen.) Private Elemente können nicht zum oder vom Objekt hinzugefügt oder entfernt werden, egal ob das Objekt eingefroren ist oder nicht.
freeze() gibt das gleiche Objekt zurück, das an die Funktion übergeben wurde. Eserstellt nicht eine gefrorene Kopie.
EinTypedArray oder einDataView mit Elementen wird einenTypeError verursachen, da sie Ansichten über Speicher sind und definitiv andere mögliche Probleme verursachen werden:
Object.freeze(new Uint8Array(0)); // No elements// Uint8Array []Object.freeze(new Uint8Array(1)); // Has elements// TypeError: Cannot freeze array buffer views with elementsObject.freeze(new DataView(new ArrayBuffer(32))); // No elements// DataView {}Object.freeze(new Float64Array(new ArrayBuffer(64), 63, 0)); // No elements// Float64Array []Object.freeze(new Float64Array(new ArrayBuffer(64), 32, 2)); // Has elements// TypeError: Cannot freeze array buffer views with elementsBeachten Sie, dass die Standard-Eigenschaften (buf.byteLength,buf.byteOffset undbuf.buffer) schreibgeschützt sind (wie auch bei einemArrayBuffer oderSharedArrayBuffer), sodass es keinen Grund gibt, zu versuchen, diese Eigenschaften einzufrieren.
Im Gegensatz zuObject.seal(), werden bestehende Eigenschaften in Objekten, die mitObject.freeze() eingefroren wurden, unveränderlich gemacht und Daten-Eigenschaften können nicht neu zugewiesen werden.
Beispiele
>Einfrieren von Objekten
const obj = { prop() {}, foo: "bar",};// Before freezing: new properties may be added,// and existing properties may be changed or removedobj.foo = "baz";obj.lumpy = "woof";delete obj.prop;// Freeze.const o = Object.freeze(obj);// The return value is just the same object we passed in.o === obj; // true// The object has become frozen.Object.isFrozen(obj); // === true// Now any changes will failobj.foo = "quux"; // silently does nothing// silently doesn't add the propertyobj.quaxxor = "the friendly duck";// In strict mode such attempts will throw TypeErrorsfunction fail() { "use strict"; obj.foo = "sparky"; // throws a TypeError delete obj.foo; // throws a TypeError delete obj.quaxxor; // returns true since attribute 'quaxxor' was never added obj.sparky = "arf"; // throws a TypeError}fail();// Attempted changes through Object.defineProperty;// both statements below throw a TypeError.Object.defineProperty(obj, "ohai", { value: 17 });Object.defineProperty(obj, "foo", { value: "eit" });// It's also impossible to change the prototype// both statements below will throw a TypeError.Object.setPrototypeOf(obj, { x: 20 });obj.__proto__ = { x: 20 };Einfrieren von Arrays
const a = [0];Object.freeze(a); // The array cannot be modified now.a[0] = 1; // fails silently// In strict mode such attempt will throw a TypeErrorfunction fail() { "use strict"; a[0] = 1;}fail();// Attempted to pusha.push(2); // throws a TypeErrorDas eingefrorene Objekt istunveränderlich. Es ist jedoch nicht unbedingtkonstant. Das folgende Beispiel zeigt, dass ein eingefrorenes Objekt nicht konstantist (Einfrieren ist oberflächlich).
const obj1 = { internal: {},};Object.freeze(obj1);obj1.internal.a = "value";obj1.internal.a; // 'value'Um ein konstantes Objekt zu sein, muss der gesamte Referenzgraph (direkte und indirekte Verweise auf andere Objekte) nur auf unveränderliche eingefrorene Objekte verweisen. Das eingefrorene Objekt gilt als unveränderlich, da der gesamte Objekt-Zustand (Werte und Verweise auf andere Objekte) innerhalb des gesamten Objekts festgelegt ist. Beachten Sie, dass Strings, Zahlen und Booleans immer unveränderlich sind und dass Funktionen und Arrays Objekte sind.
Tiefes Einfrieren
Das Ergebnis des Aufrufs vonObject.freeze(object) gilt nur für dieunmittelbaren Eigenschaften desobject selbst und wird nur zukünftige Eigenschafts-hinzufügungen, -entfernungen oder Werte-Neuzuweisungsoperationennur aufobject verhindern. Wenn der Wert dieser Eigenschaften selbst Objekte sind, sind dieseObjekte nicht eingefroren und können das Ziel von Eigenschafts-Hinzu-fügungen, -entfernungen oder Werte-Neuzuweisungsoperationen sein.
const employee = { name: "Mayank", designation: "Developer", address: { street: "Rohini", city: "Delhi", },};Object.freeze(employee);employee.name = "Dummy"; // fails silently in non-strict modeemployee.address.city = "Noida"; // attributes of child object can be modifiedconsole.log(employee.address.city); // "Noida"Um ein Objekt unveränderlich zu machen, frieren Sie rekursiv jede nicht-primitive Eigenschaft (tiefes Einfrieren) ein. Verwenden Sie das Muster fallweise basierend auf Ihrem Design, wenn Sie wissen, dass das Objekt keineZyklen im Referenzgraphen enthält, da sonst eine Endlosschleife ausgelöst wird. Beispielsweise haben Funktionen, die mit derfunction-Syntax erstellt wurden, eineprototype-Eigenschaft mit einerconstructor-Eigenschaft, die auf die Funktion selbst verweist, sodass sie standardmäßig Zyklen aufweisen. Andere Funktionen, wiePfeilfunktionen, können dennoch eingefroren werden.
Eine Verbesserung fürdeepFreeze() wäre, die Objekte zu speichern, die es bereits besucht hat, sodass Sie das rekursive Aufrufen vondeepFreeze() unterdrücken können, wenn ein Objekt gerade unveränderlich gemacht wird. Ein Beispiel dafür finden Sie unterVerwendung vonWeakSet zur Erkennung von zirkulären Referenzen. Es besteht weiterhin das Risiko, ein Objekt einzufrieren, das nicht eingefroren werden sollte, wie daswindow.
function deepFreeze(object) { // Retrieve the property names defined on object const propNames = Reflect.ownKeys(object); // Freeze properties before freezing self for (const name of propNames) { const value = object[name]; if ((value && typeof value === "object") || typeof value === "function") { deepFreeze(value); } } return Object.freeze(object);}const obj2 = { internal: { a: null, },};deepFreeze(obj2);obj2.internal.a = "anotherValue"; // fails silently in non-strict modeobj2.internal.a; // nullSpezifikationen
| Specification |
|---|
| ECMAScript® 2026 Language Specification> # sec-object.freeze> |