Middle
Wie kann man die Änderung eines Objekts in JavaScript verbieten?
sobes.tech KI
Antwort von AI
Sie können die integrierten Methoden von Object verwenden:
Object.preventExtensions(obj): Verhindert das Hinzufügen neuer Eigenschaften zum Objekt, erlaubt jedoch das Ändern und Löschen bestehender Eigenschaften.Object.seal(obj): Verhindert das Hinzufügen und Löschen von Eigenschaften, erlaubt jedoch das Ändern bestehender Eigenschaften. Tatsächlich ist diespreventExtensions+ Verbot des Löschens.Object.freeze(obj): Verhindert das Hinzufügen, Löschen und Ändern von Eigenschaften. Macht das Objekt tief unveränderlich. Dies istseal+ Verbot, bestehende Eigenschaften zu ändern.
Beispiel:
// Ursprüngliches Objekt
let myObject = { name: 'Alice', age: 30 };
// preventExtensions
Object.preventExtensions(myObject);
myObject.city = 'London'; // Funktioniert nicht im strengen Modus, wird im nicht-strengen Modus ignoriert.
// seal
let mySealedObject = { name: 'Bob', age: 25 };
Object.seal(mySealedObject);
mySealedObject.age = 26; // Funktioniert
delete mySealedObject.name; // Funktioniert nicht im strengen Modus.
mySealedObject.city = 'Paris'; // Funktioniert nicht im strengen Modus.
// freeze
let myFrozenObject = { name: 'Charlie', age: 35 };
Object.freeze(myFrozenObject);
myFrozenObject.age = 36; // Funktioniert nicht im strengen Modus.
delete myFrozenObject.name; // Funktioniert nicht im strengen Modus.
myFrozenObject.city = 'New York'; // Funktioniert nicht im strengen Modus.
Wichtig ist, dass Object.freeze oberflächlich ist. Wenn das Objekt Verweise auf andere Objekte enthält, können diese verschachtelten Objekte geändert werden, wenn sie nicht selbst eingefroren sind. Für eine tiefe Einfrierung ist eine rekursive Funktion erforderlich.
// Beispiel für tiefe Einfrierung
function deepFreeze(obj) {
Object.freeze(obj); // Friert das aktuelle Objekt ein
for (const key in obj) {
if (Object.prototype.hasOwnProperty.call(obj, key)) {
const prop = obj[key];
// Wenn die Eigenschaft ein Objekt ist (und nicht null), wird sie rekursiv eingefroren
if (typeof prop === 'object' && prop !== null && !Object.isFrozen(prop)) {
deepFreeze(prop);
}
}
}
}
let nestedObject = {
name: 'Deep',
details: {
level: 1
}
};
deepFreeze(nestedObject);
nestedObject.details.level = 2; // Funktioniert nicht im strengen Modus.
Vergleichstabelle:
| Methode | Hinzufügen von Eigenschaften | Löschen von Eigenschaften | Ändern von Eigenschaften |
|---|---|---|---|
Object.preventExtensions() |
Nein | Ja | Ja |
Object.seal() |
Nein | Nein | Ja |
Object.freeze() |
Nein | Nein | Nein |