Sobes.tech
Middle

Ako zakázať zmenu objektu v JavaScripte?

sobes.tech AI

Odpoveď od AI

Môžete použiť vstavané metódy Object:

  1. Object.preventExtensions(obj): Zakazuje pridávanie nových vlastností k objektu, ale umožňuje meniť a odstraňovať existujúce.
  2. Object.seal(obj): Zakazuje pridávanie a odstraňovanie vlastností, ale umožňuje meniť existujúce. V podstate je to preventExtensions + zákaz odstraňovania.
  3. Object.freeze(obj): Zakazuje pridávanie, odstraňovanie a zmenu vlastností. Robí objekt plytko nemenným. Ide o seal + 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