Sobes.tech
Middle

Jak lze zakázat změnu objektu v JavaScriptu?

sobes.tech AI

Odpověď od AI

Můžete použít vestavěné metody Object:

  1. Object.preventExtensions(obj): Zakazuje přidávání nových vlastností k objektu, ale umožňuje upravovat a mazat stávající.
  2. Object.seal(obj): Zakazuje přidávání a mazání vlastností, ale umožňuje upravovat stávající. Ve skutečnosti je to preventExtensions + zákaz mazání.
  3. Object.freeze(obj): Zakazuje přidávání, mazání a upravování vlastností. Dělá objekt hluboce neměnným. To je seal + 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