Middle
Ako zakázať zmenu objektu v JavaScripte?
sobes.tech AI
Odpoveď od AI
Môžete použiť vstavané metódy Object:
Object.preventExtensions(obj): Zakazuje pridávanie nových vlastností k objektu, ale umožňuje meniť a odstraňovať existujúce.Object.seal(obj): Zakazuje pridávanie a odstraňovanie vlastností, ale umožňuje meniť existujúce. V podstate je topreventExtensions+ zákaz odstraňovania.Object.freeze(obj): Zakazuje pridávanie, odstraňovanie a zmenu vlastností. Robí objekt plytko nemenným. Ide oseal+ zákaz zmeny existujúcich vlastností.
Príklad použitia:
// Počiatočný objekt
let myObject = { name: 'Alice', age: 30 };
// preventExtensions
Object.preventExtensions(myObject);
myObject.city = 'London'; // Nebude fungovať v prísnom režime, v neprísnom režime bude ignorované.
// seal
let mySealedObject = { name: 'Bob', age: 25 };
Object.seal(mySealedObject);
mySealedObject.age = 26; // Bude fungovať
delete mySealedObject.name; // Nebude fungovať v prísnom režime.
mySealedObject.city = 'Paris'; // Nebude fungovať v prísnom režime.
// freeze
let myFrozenObject = { name: 'Charlie', age: 35 };
Object.freeze(myFrozenObject);
myFrozenObject.age = 36; // Nebude fungovať v prísnom režime.
delete myFrozenObject.name; // Nebude fungovať v prísnom režime.
myFrozenObject.city = 'New York'; // Nebude fungovať v prísnom režime.
Dôležité je pamätať, že Object.freeze je plytko nemenné. Ak objekt obsahuje odkazy na iné objekty, tieto vnorené objekty môžu byť meniace, ak nie sú zamrznuté sami. Pre hlboké zamrazenie je potrebná rekurzívna funkcia.
// Príklad hlbokého zamrazenia
function deepFreeze(obj) {
Object.freeze(obj); // Zamrazíme aktuálny objekt
for (const key in obj) {
if (Object.prototype.hasOwnProperty.call(obj, key)) {
const prop = obj[key];
// Ak je vlastnosť objekt (a nie null), rekurzívne ju zamrazíme
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 fungovať v prísnom režime.
Porovnávacia tabuľka:
| Metóda | Pridanie vlastností | Odstránenie vlastností | Zmena vlastností |
|---|---|---|---|
Object.preventExtensions() |
Nie | Áno | Áno |
Object.seal() |
Nie | Nie | Áno |
Object.freeze() |
Nie | Nie | Nie |