Sobes.tech
Middle

Kuidas keelata objekti muutmine JavaScriptis?

sobes.tech AI

Vastus AI-lt

Jūs varat izmantot iebūvētos Object metodes:

  1. Object.preventExtensions(obj): Aizliedz pievienot jaunas īpašības objektam, bet ļauj mainīt un dzēst esošās.
  2. Object.seal(obj): Aizliedz pievienot un dzēst īpašības, bet ļauj mainīt esošās. Būtībā tas ir preventExtensions + aizliegums dzēst.
  3. Object.freeze(obj): Aizliedz pievienot, dzēst un mainīt īpašības. Padara objektu neizmaināmu dziļi. Tas ir seal + aizliegums mainīt esošās īpašības.

Piemērs:

// Sākotnējais objekts
let myObject = { name: 'Alice', age: 30 };

// preventExtensions
Object.preventExtensions(myObject);
myObject.city = 'London'; // Nedarbojas stingrā režīmā, ne stingrā režīmā vienkārši tiks ignorēts.

// seal
let mySealedObject = { name: 'Bob', age: 25 };
Object.seal(mySealedObject);
mySealedObject.age = 26; // Darbosies
delete mySealedObject.name; // Nevarēs stingrā režīmā.
mySealedObject.city = 'Paris'; // Nevarēs stingrā režīmā.

// freeze
let myFrozenObject = { name: 'Charlie', age: 35 };
Object.freeze(myFrozenObject);
myFrozenObject.age = 36; // Nevarēs stingrā režīmā.
delete myFrozenObject.name; // Nevarēs stingrā režīmā.
myFrozenObject.city = 'New York'; // Nevarēs stingrā režīmā.

Svarīgi atcerēties, ka Object.freeze nav dziļš. Ja objekts satur atsauces uz citām objektiem, šie iekšējie objekti var tikt mainīti, ja tie paši nav aizsaluši. Lai dziļi aizsalītu, nepieciešama rekursīva funkcija:

// Piemērs dziļai aizsalšanai
function deepFreeze(obj) {
  Object.freeze(obj); // Aizsalst pašreizējo objektu

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

      // Ja īpašība ir objekts (un nav null), rekursīvi aizsalst
      if (typeof prop === 'object' && prop !== null && !Object.isFrozen(prop)) {
        deepFreeze(prop);
      }
    }
  }
}

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

deepFreeze(nestedObject);
nestedObject.details.level = 2; // Nevarēs stingrā režīmā.

Salīdzināšanas tabula:

Metode Pievienot īpašības Dzēst īpašības Mainīt īpašības
Object.preventExtensions()
Object.seal()
Object.freeze()