Sobes.tech
Middle

Kaip uždrausti objekto keitimą JavaScript?

sobes.tech AI

Atsakymas iš AI

Galite naudoti įmontuotus Object metodus:

  1. Object.preventExtensions(obj): Užkerta kelią pridėti naujų savybių prie objekto, bet leidžia keisti ir naikinti esamas.
  2. Object.seal(obj): Užkerta kelią pridėti ir naikinti savybes, bet leidžia keisti esamas. Iš esmės tai yra preventExtensions + užkirsti kelią naikinti.
  3. Object.freeze(obj): Užkerta kelią pridėti, naikinti ir keisti savybes. Padaro objektą neplėtinį. Tai yra seal + užkirsti kelią keisti esamas savybes.

Pavyzdys:

// Pradinė objektas
let myObject = { name: 'Alice', age: 30 };

// preventExtensions
Object.preventExtensions(myObject);
myObject.city = 'London'; // Nebus veiksmo griežtame režime, negriežtame režime tiesiog ignoruos.

// seal
let mySealedObject = { name: 'Bob', age: 25 };
Object.seal(mySealedObject);
mySealedObject.age = 26; // Veiks
delete mySealedObject.name; // Nebus veiksmo griežtame režime.
mySealedObject.city = 'Paris'; // Nebus veiksmo griežtame režime.

// freeze
let myFrozenObject = { name: 'Charlie', age: 35 };
Object.freeze(myFrozenObject);
myFrozenObject.age = 36; // Nebus veiksmo griežtame režime.
delete myFrozenObject.name; // Nebus veiksmo griežtame režime.
myFrozenObject.city = 'New York'; // Nebus veiksmo griežtame režime.

Svarbu prisiminti, kad Object.freeze nėra gili. Jei objektas turi nuorodas į kitus objektus, šie vidiniai objektai gali būti keičiami, jei jie patys nėra užšaldyti. Giliam užšaldymui reikalinga rekursinė funkcija:

// Pavyzdys giliam užšaldymui
function deepFreeze(obj) {
  Object.freeze(obj); // Užšaldome dabartinį objektą

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

      // Jei savybė yra objektas (ir nėra null), rekursyviai užšaldome
      if (typeof prop === 'object' && prop !== null && !Object.isFrozen(prop)) {
        deepFreeze(prop);
      }
    }
  }
}

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

deepFreeze(nestedObject);
nestedObject.details.level = 2; // Nebus veiksmo griežtame režime.

Lyginamoji lentelė:

Metodas Pridėti savybes Ištrinti savybes Keisti savybes
Object.preventExtensions() Ne Taip Taip
Object.seal() Ne Ne Taip
Object.freeze() Ne Ne Ne