Middle
Cum se poate interzice modificarea unui obiect în JavaScript?
sobes.tech AI
Răspuns de la AI
Puteți utiliza metodele încorporate ale Object:
Object.preventExtensions(obj): Interzice adăugarea de noi proprietăți la obiect, dar permite modificarea și ștergerea celor existente.Object.seal(obj): Interzice adăugarea și ștergerea proprietăților, dar permite modificarea celor existente. În esență, acesta estepreventExtensions+ interzicerea ștergerii.Object.freeze(obj): Interzice adăugarea, ștergerea și modificarea proprietăților. Face obiectul imutabil în profunzime. Acesta esteseal+ interzicerea modificării proprietăților existente.
Exemplu de utilizare:
// Obiect inițial
let myObject = { name: 'Alice', age: 30 };
// preventExtensions
Object.preventExtensions(myObject);
myObject.city = 'London'; // Nu va avea efect în modul strict, va fi ignorat în modul non-strict.
// seal
let mySealedObject = { name: 'Bob', age: 25 };
Object.seal(mySealedObject);
mySealedObject.age = 26; // Va funcționa
delete mySealedObject.name; // Nu va funcționa în modul strict.
mySealedObject.city = 'Paris'; // Nu va funcționa în modul strict.
// freeze
let myFrozenObject = { name: 'Charlie', age: 35 };
Object.freeze(myFrozenObject);
myFrozenObject.age = 36; // Nu va funcționa în modul strict.
delete myFrozenObject.name; // Nu va funcționa în modul strict.
myFrozenObject.city = 'New York'; // Nu va funcționa în modul strict.
Este important să rețineți că Object.freeze este superficial. Dacă obiectul conține referințe către alte obiecte, aceste obiecte imbricate pot fi modificate dacă nu sunt și ele înghețate. Pentru înghețarea profundă, este necesară o funcție recursivă.
// Exemplu de înghețare profundă
function deepFreeze(obj) {
Object.freeze(obj); // Îngheață obiectul curent
for (const key in obj) {
if (Object.prototype.hasOwnProperty.call(obj, key)) {
const prop = obj[key];
// Dacă proprietatea este un obiect (și nu null), îl îngheață recursiv
if (typeof prop === 'object' && prop !== null && !Object.isFrozen(prop)) {
deepFreeze(prop);
}
}
}
}
let nestedObject = {
name: 'Deep',
details: {
level: 1
}
};
deepFreeze(nestedObject);
nestedObject.details.level = 2; // Nu va funcționa în modul strict.
Tabel comparativ:
| Metodă | Adăugare proprietăți | Ștergere proprietăți | Modificare proprietăți |
|---|---|---|---|
Object.preventExtensions() |
Nu | Da | Da |
Object.seal() |
Nu | Nu | Da |
Object.freeze() |
Nu | Nu | Nu |