Die Object.freeze()
Methode friert ein Objekt ein: dass heißt, es verhindert das Hinzufügen von neuen Eigenschaften zum Objekt; verhindert das Entfernen von bestehenden Eigenschaften; und verhindert, dass bestehende Eigenschaften, oder deren Abzählbarkeit, Konfigurierbarkeit oder Beschreibbarkeit verändert werden. Im Wesentlichen wird das Objekt praktisch unveränderbar gemacht. Die Methode gibt das Objekt in einer eingefrorenen Version zurück.
Syntax
Object.freeze(obj)
Parameter
obj
- Das einzufrierende Objekt.
Rückgabewert
Das eingefrorende Objekt.
Beschreibung
Einem eingefrorenen Objekt können Eigenschaft weder entfernt noch hinzugefügt werden. Jeder Versuch dies durchzufüren scheitert, entweder ohne Rückmeldung , oder durch den Wurf einer TypeError
Ausnahme (in den meisten Fällen, aber nicht ausschließlich im strict mode).
Werte können für Daten-Eigenschaften nicht verändert werden. Zugriffs-Eigenschaften (getter und setter) funktionieren gleich (und geben die Illusion, dass der Wert verändert wurde). Zu bemerken ist, dass Werte, die Objekte sind, trotzdem verändert werden können, außer sie wurden auch eingefroren.
Beispiele
var obj = { prop: function() {}, foo: 'bar' }; // Neue Eigenschaften können hinzugefügt, bestehende verändert oder entfernt werden obj.foo = 'baz'; obj.lumpy = 'woof'; delete obj.prop; // Sowohl das übergebene als auch das zurückgegebene Objekt werden eingefroren. // Es nicht nötig das zurückgegebene Objekt in einer Variable zu speichern, wenn das // Original eingefroren werden soll. var o = Object.freeze(obj); o === obj; // true Object.isFrozen(obj); // === true // Nun scheitern jegliche Veränderungen obj.foo = 'quux'; // tut (stillschweigend) nichts obj.quaxxor = 'the friendly duck'; // fügt die Eigenschaft (stillschweigend) nicht hinzu // ... und im strict mode werfen solche Versuche TypeErrors function fail(){ 'use strict'; obj.foo = 'sparky'; // wirft einen TypeError delete obj.quaxxor; // wirft einen TypeError obj.sparky = 'arf'; // wirft einen TypeError } fail(); // Versuchte Veränderungen durch Object.defineProperty werfen ebenso TypeErrors Object.defineProperty(obj, 'ohai', { value: 17 }); // wirft einen TypeError Object.defineProperty(obj, 'foo', { value: 'eit' }); // wirft einen TypeError
Das folgende Beispiel zeigt, dass Objekt-Werte in einem eingefrorenen Objekt verändert werden können (freeze ist flach).
obj1 = { internal: {} }; Object.freeze(obj1); obj1.internal.a = 'aValue'; obj1.internal.a // 'aValue' // To make obj fully immutable, freeze each object in obj. // To do so, we use this function. // Um obj vollständig unveränderbar zu machen, friere jedes Objekt in obj ein. function deepFreeze(obj) { // Ermittle die Namen der für obj definierten Eigenschaften var propNames = Object.getOwnPropertyNames(obj); // Friere die Eigenschaften ein, bevor obj selbst eingefroren wird propNames.forEach(function(name) { var prop = obj[name]; // Friere prop ein wenn es ein Objekt ist if (typeof prop == 'object' && prop !== null) deepFreeze(prop); }); // Friere obj selbst ein return Object.freeze(obj); } obj2 = { internal: {} }; deepFreeze(obj2); obj2.internal.a = 'anotherValue'; obj2.internal.a; // undefined
Bemerkungen
In ES5 wird ein TypeError
geworfen wenn das Argument für diese Methode kein Objekt (sondern ein primitiver Typ) ist. In ES6 wird jedes nicht-Objekt-Argument so behandelt als wenn es ein gewöhnliches, bereits eingefrorenes Objekt wäre und einfach zurückgegeben.
> Object.freeze(1) TypeError: 1 is not an object // ES5 code > Object.freeze(1) 1 // ES6 code
Spezifikationen
Spezifikation | Status | Kommentar |
---|---|---|
ECMAScript 5.1 (ECMA-262) Die Definition von 'Object.freeze' in dieser Spezifikation. |
Standard | Ursprüngliche Definition. Implementiert in JavaScript 1.8.5. |
ECMAScript 2015 (6th Edition, ECMA-262) Die Definition von 'Object.freeze' in dieser Spezifikation. |
Standard | |
ECMAScript 2017 Draft (ECMA-262) Die Definition von 'Object.freeze' in dieser Spezifikation. |
Entwurf |
Browserkompatibilität
Feature | Firefox (Gecko) | Chrome | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|
Basic support | 4.0 (2) | 6 | 9 | 12 | 5.1 |
Feature | Firefox Mobile (Gecko) | Android | IE Mobile | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|
Basic support | ? | ? | ? | ? | ? |