Sobes.tech
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:

  1. Object.preventExtensions(obj): Interzice adăugarea de noi proprietăți la obiect, dar permite modificarea și ștergerea celor existente.
  2. Object.seal(obj): Interzice adăugarea și ștergerea proprietăților, dar permite modificarea celor existente. În esență, acesta este preventExtensions + interzicerea ștergerii.
  3. Object.freeze(obj): Interzice adăugarea, ștergerea și modificarea proprietăților. Face obiectul imutabil în profunzime. Acesta este seal + 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