Sobes.tech
Middle

Hogyan lehet megtiltani egy objektum módosítását JavaScriptben?

sobes.tech MI

Válasz az MI-től

Beépített Object módszereket használhat:

  1. Object.preventExtensions(obj): Megakadályozza új tulajdonságok hozzáadását az objektumhoz, de lehetővé teszi a meglévők módosítását és törlését.
  2. Object.seal(obj): Megakadályozza tulajdonságok hozzáadását és törlését, de lehetővé teszi a meglévők módosítását. Ez valójában preventExtensions + tiltás a törlésre.
  3. Object.freeze(obj): Megakadályozza tulajdonságok hozzáadását, törlését és módosítását. Mélyen immutábilissá teszi az objektumot. Ez seal + tiltás a meglévő tulajdonságok módosítására.

Használati példa:

// Kezdeti objektum
let myObject = { name: 'Alice', age: 30 };

// preventExtensions
Object.preventExtensions(myObject);
myObject.city = 'London'; // Nem fog működni szigorú módban, nem szigorú módban egyszerűen figyelmen kívül marad.

// seal
let mySealedObject = { name: 'Bob', age: 25 };
Object.seal(mySealedObject);
mySealedObject.age = 26; // Működik
delete mySealedObject.name; // Nem működik szigorú módban.
mySealedObject.city = 'Paris'; // Nem működik szigorú módban.

// freeze
let myFrozenObject = { name: 'Charlie', age: 35 };
Object.freeze(myFrozenObject);
myFrozenObject.age = 36; // Nem működik szigorú módban.
delete myFrozenObject.name; // Nem működik szigorú módban.
myFrozenObject.city = 'New York'; // Nem működik szigorú módban.

Fontos megjegyezni, hogy a Object.freeze felületi. Ha az objektum más objektumokra mutató hivatkozásokat tartalmaz, ezek az al-objektumok módosíthatók, ha nem vannak maguk is befagyasztva. Mélyfagyasztáshoz rekurzív függvény szükséges.

// Mélyfagyasztás példája
function deepFreeze(obj) {
  Object.freeze(obj); // Befagyasztja az aktuális objektumot

  for (const key in obj) {
    if (Object.prototype.hasOwnProperty.call(obj, key)) {
      const prop = obj[key];

      // Ha a tulajdonság egy objektum (és nem null), rekurzívan befagyasztjuk
      if (typeof prop === 'object' && prop !== null && !Object.isFrozen(prop)) {
        deepFreeze(prop);
      }
    }
  }
}

let nestedObject = {
  name: 'Deep',
  details: {
    level: 1
  }
};

deepFreeze(nestedObject);
nestedObject.details.level = 2; // Nem fog működni szigorú módban.

Összehasonlító táblázat:

Metódus Tulajdonságok hozzáadása Tulajdonságok törlése Tulajdonságok módosítása
Object.preventExtensions() Nem Igen Igen
Object.seal() Nem Nem Igen
Object.freeze() Nem Nem Nem