Middle
Jak lze zakázat změnu objektu v JavaScriptu?
sobes.tech AI
Odpověď od AI
Můžete použít vestavěné metody Object:
Object.preventExtensions(obj): Zakazuje přidávání nových vlastností k objektu, ale umožňuje upravovat a mazat stávající.Object.seal(obj): Zakazuje přidávání a mazání vlastností, ale umožňuje upravovat stávající. Ve skutečnosti je topreventExtensions+ zákaz mazání.Object.freeze(obj): Zakazuje přidávání, mazání a upravování vlastností. Dělá objekt hluboce neměnným. To jeseal+ zákaz změn stávajících vlastností.
Příklad použití:
// Původní objekt
let myObject = { name: 'Alice', age: 30 };
// preventExtensions
Object.preventExtensions(myObject);
myObject.city = 'London'; // Nebude fungovat v režimu přísném, v režimu ne přísném bude ignorováno.
// seal
let mySealedObject = { name: 'Bob', age: 25 };
Object.seal(mySealedObject);
mySealedObject.age = 26; // Funguje
delete mySealedObject.name; // Nebude fungovat v režimu přísném.
mySealedObject.city = 'Paris'; // Nebude fungovat v režimu přísném.
// freeze
let myFrozenObject = { name: 'Charlie', age: 35 };
Object.freeze(myFrozenObject);
myFrozenObject.age = 36; // Nebude fungovat v režimu přísném.
delete myFrozenObject.name; // Nebude fungovat v režimu přísném.
myFrozenObject.city = 'New York'; // Nebude fungovat v režimu přísném.
Je důležité si pamatovat, že Object.freeze je povrchové. Pokud objekt obsahuje odkazy na jiné objekty, tyto vnořené objekty lze měnit, pokud nejsou také zamrzlé. Pro hluboké zamrazení je třeba rekurzivní funkce.
// Příklad hlubokého zamrazení
function deepFreeze(obj) {
Object.freeze(obj); // Zamrazí aktuální objekt
for (const key in obj) {
if (Object.prototype.hasOwnProperty.call(obj, key)) {
const prop = obj[key];
// Pokud je vlastnost objekt (a není null), zamrazí ji rekurzivně
if (typeof prop === 'object' && prop !== null && !Object.isFrozen(prop)) {
deepFreeze(prop);
}
}
}
}
let nestedObject = {
name: 'Deep',
details: {
level: 1
}
};
deepFreeze(nestedObject);
nestedObject.details.level = 2; // Nebude fungovat v režimu přísném.
Porovnávací tabulka:
| Metoda | Přidání vlastností | Odstranění vlastností | Úprava vlastností |
|---|---|---|---|
Object.preventExtensions() |
Ne | Ano | Ano |
Object.seal() |
Ne | Ne | Ano |
Object.freeze() |
Ne | Ne | Ne |