Sobes.tech
Middle

Wie macht man eine Eigenschaft eines Objekts unveränderlich?

sobes.tech KI

Antwort von AI

Es gibt mehrere Möglichkeiten, eine Eigenschaft eines Objekts unveränderlich zu machen:

  1. Verwendung von Object.defineProperty():

    Diese Methode ermöglicht es, die Eigenschaften eines Objekts mit einer feineren Kontrolle zu definieren oder zu ändern. Um eine unveränderliche Eigenschaft zu erstellen, muss der Deskriptor der Eigenschaft mit writable: false gesetzt werden.

    const obj = {};
    Object.defineProperty(obj, 'myProperty', {
      value: 'Unveränderlicher Wert',
      writable: false, // Macht die Eigenschaft unveränderlich
      enumerable: true, // Die Eigenschaft ist bei Iterationen sichtbar
      configurable: true // Die Eigenschaft kann gelöscht oder ihr Deskriptor geändert werden
    });
    
    // Der Versuch, den Wert zu ändern, wird im Nicht-Strikt-Modus ignoriert
    // und löst im Strikt-Modus einen TypeError aus
    obj.myProperty = 'Neuer Wert';
    console.log(obj.myProperty); // Gibt "Unveränderlicher Wert" aus
    

    Wenn configurable: false gesetzt ist, kann die Eigenschaft nicht gelöscht oder ihr Deskriptor geändert werden (einschließlich writable).

    const obj2 = {};
    Object.defineProperty(obj2, 'myProperty', {
      value: 'Unveränderlich und nicht leicht löschbar',
      writable: false,
      enumerable: true,
      configurable: false // Macht den Deskriptor unveränderlich
    });
    
    // Versuch, den Wert zu ändern
    obj2.myProperty = 'Neuer Wert';
    console.log(obj2.myProperty); // Gibt "Unveränderlich und nicht leicht löschbar" aus
    
    // Versuch, die Eigenschaft zu löschen
    delete obj2.myProperty;
    console.log(obj2.myProperty); // Gibt "Unveränderlich und nicht leicht löschbar" aus
    
  2. Verwendung von Object.freeze():

    Diese Methode "friert" das Objekt ein. Das bedeutet, dass keine neuen Eigenschaften hinzugefügt, bestehende gelöscht, Werte geändert oder das Prototyp des Objekts modifiziert werden können.

    const obj = {
      myProperty: 'Unveränderlicher Wert'
    };
    
    Object.freeze(obj);
    
    // Versuch, den Wert zu ändern
    obj.myProperty = 'Neuer Wert';
    console.log(obj.myProperty); // Gibt "Unveränderlicher Wert" aus
    
    // Versuch, eine neue Eigenschaft hinzuzufügen
    obj.newProperty = 'Neu';
    console.log(obj.newProperty); // Gibt undefined aus
    
    // Versuch, die Eigenschaft zu löschen
    delete obj.myProperty;
    console.log(obj.myProperty); // Gibt "Unveränderlicher Wert" aus
    

    Es ist wichtig zu beachten, dass Object.freeze() oberflächlich ist. Wenn eine Eigenschaft des Objekts ein anderes Objekt ist, wird dieses innere Objekt nicht eingefroren.

  3. Verwendung von const für Variablen, die Objekte enthalten:

    Das Schlüsselwort const macht die Referenz auf das Objekt unveränderlich, das Objekt selbst jedoch nicht. Sie können die Variable nicht neu zuweisen, aber die Eigenschaften des Objekts ändern.

    const obj = {
      myProperty: 'Anfangswert'
    };
    
    // Der Wert der Eigenschaft kann geändert werden
    obj.myProperty = 'Neuer Wert';
    console.log(obj.myProperty); // Gibt "Neuer Wert" aus
    
    // Die Variable kann nicht neu zugewiesen werden
    // obj = { andereEigenschaft: 'Andere' }; // Führt zu einem TypeError
    

Vergleich der Methoden:

Methode Was macht unveränderlich? Ebene der Unveränderlichkeit
Object.defineProperty() Eine bestimmte Eigenschaft Durch den Deskriptor definiert
Object.freeze() Das gesamte Objekt Oberflächlich
const Die Referenz auf das Objekt Variable

Die Wahl der Methode hängt davon ab, wie granular die Unveränderlichkeit sein soll. Für eine einzelne Eigenschaft eignet sich Object.defineProperty(), für das gesamte Objekt Object.freeze(). Um die Neu-Zuweisung der Referenz zu verhindern, wird const verwendet.