Start · Sprachen · JavaScript · Referenz · Object.isFrozen()

Object.isFrozen()

Methode

Prüft, ob ein Objekt eingefroren ist, also nicht erweiterbar ist und alle eigenen Eigenschaften nicht konfigurierbar und (bei Dateneigenschaften) nicht beschreibbar sind.

seit JavaScript ES5 (ES2015: Nicht-Objekte liefern true statt Type Kategorie: method-property

Signatur

Object.isFrozen(obj)

Beschreibung

Object.isFrozen() gibt true zurück, wenn ein Objekt eingefroren ist. Das heißt: Es können keine neuen Eigenschaften hinzugefügt werden (nicht erweiterbar), alle eigenen Eigenschaften sind nicht konfigurierbar, und alle eigenen Dateneigenschaften sind zusätzlich nicht beschreibbar (writable: false). Accessor-Eigenschaften (Getter/Setter) gelten nur als nicht konfigurierbar; ihr Setter kann weiterhin aufgerufen werden.

Die Methode prüft den tatsächlichen Zustand und nicht, ob irgendwann Object.freeze() aufgerufen wurde. Ein leeres, nicht erweiterbares Objekt ist daher ebenfalls eingefroren, auch wenn Object.freeze() nie aufgerufen wurde. Ebenso kann man ein Objekt über Object.preventExtensions() und Object.defineProperty() von Hand „einfrieren“.

Typische Einsatzfälle sind Absicherungen in Bibliotheken (z. B. „dieser Zustand darf nicht verändert werden“), Tests für unveränderliche Datenstrukturen oder Debugging, wenn Zuweisungen scheinbar folgenlos bleiben. Beachte, dass die Prüfung flach ist: Verschachtelte Objekte werden nicht untersucht.

Parameter

Name Typ Default Beschreibung
$obj Pflicht any Der zu prüfende Wert. Seit ES2015 werden auch Primitive akzeptiert (sie gelten immer als eingefroren).

Beispiele

Grundlegende Prüfung nach Object.freeze()

const config = { api: 'https://example.com', timeout: 5000 };
console.log(Object.isFrozen(config));

Object.freeze(config);
console.log(Object.isFrozen(config));

config.timeout = 1; // wird im Sloppy Mode still ignoriert
console.log(config.timeout);
false true 5000

Randfälle: leere Objekte, sealed und Primitive

// Leeres, nicht erweiterbares Objekt ist automatisch eingefroren
const leer = Object.preventExtensions({});
console.log(Object.isFrozen(leer));

// Versiegelt, aber Werte noch beschreibbar -> nicht eingefroren
const sealed = Object.seal({ a: 1 });
console.log(Object.isFrozen(sealed));

// Primitive gelten seit ES2015 als eingefroren
console.log(Object.isFrozen(42), Object.isFrozen('text'));
true false true true

Flache Prüfung und rekursives isDeepFrozen

const state = Object.freeze({ user: { name: 'Ada' } });
console.log(Object.isFrozen(state));      // true
console.log(Object.isFrozen(state.user)); // false – verschachtelt!

const isDeepFrozen = (obj) =>
  Object.isFrozen(obj) &&
  Reflect.ownKeys(obj).every((key) => {
    const value = obj[key];
    return typeof value !== 'object' || value === null || isDeepFrozen(value);
  });

console.log(isDeepFrozen(state));
true false false

Absicherung in einer Funktion

'use strict';
const updateSettings = (settings, patch) => {
  if (Object.isFrozen(settings)) {
    // Kopie statt Mutation erzeugen
    return { ...settings, ...patch };
  }
  return Object.assign(settings, patch);
};

const defaults = Object.freeze({ theme: 'light' });
const result = updateSettings(defaults, { theme: 'dark' });
console.log(result.theme, defaults.theme);
dark light

// Wichtig · Fallstricke

  • Nur flach: Object.isFrozen() prüft nur die eigenen Eigenschaften der obersten Ebene. Verschachtelte Objekte und Arrays können trotzdem veränderbar sein. Für eine tiefe Prüfung musst du selbst rekursiv prüfen.
  • ES5 im Vergleich zu ES2015: In ES5 löste ein Nicht-Objekt als Argument einen TypeError aus. Seit ES2015 liefert Object.isFrozen(1) einfach true.
  • Accessor-Eigenschaften: Ein eingefrorenes Objekt kann Setter enthalten, die weiterhin internen (Closure-)Zustand ändern. „Eingefroren“ heißt also nicht automatisch „komplett unveränderlich“.
  • Typed Arrays: Nicht leere TypedArrays lassen sich nicht einfrieren (Object.freeze() wirft einen TypeError). Object.isFrozen() liefert bei ihnen daher false.
  • Zuweisungen an eingefrorene Objekte scheitern im Sloppy Mode still und werfen im Strict Mode einen TypeError.
  • Kompatibilität: Wird von allen modernen Browsern und von Node.js unterstützt (Baseline).