Sobes.tech
Middle

Ինչպե՞ս կարելի է արգելել օբյեկտի փոփոխությունը JavaScript-ում։

sobes.tech AI

Պատասխան AI-ից

Կարող եք օգտագործել ներքին մեթոդներ Object:

  1. Object.preventExtensions(obj): արգելում է նոր հատկությունների ավելացումը օբյեկտին, բայց թույլ է տալիս փոփոխել և հեռացնել առկա հատկությունները:
  2. Object.seal(obj): արգելում է հատկությունների ավելացումը և հեռացումը, բայց թույլ է տալիս փոփոխել առկա հատկությունները:
  3. Object.freeze(obj): արգելում է հատկությունների ավելացումը, հեռացումը և փոփոխությունը, դարձնելով օբյեկտը անփոփոխ:

Օրինակ օգտագործման:

// սկզբնական օբյեկտ
let myObject = { name: 'Alice', age: 30 };

// preventExtensions
Object.preventExtensions(myObject);
myObject.city = 'London'; // Չի աշխատի խիստ ռեժիմում, ոչ խիստ ռեժիմում պարզապես անտեսվում է:

// seal
let mySealedObject = { name: 'Bob', age: 25 };
Object.seal(mySealedObject);
mySealedObject.age = 26; // Աշխատում է
delete mySealedObject.name; // Չի աշխատի խիստ ռեժիմում
mySealedObject.city = 'Paris'; // Չի աշխատի խիստ ռեժիմում

// freeze
let myFrozenObject = { name: 'Charlie', age: 35 };
Object.freeze(myFrozenObject);
myFrozenObject.age = 36; // Չի աշխատի խիստ ռեժիմում
delete myFrozenObject.name; // Չի աշխատի խիստ ռեժիմում
myFrozenObject.city = 'New York'; // Չի աշխատի խիստ ռեժիմում

Կարևոր է հիշել, որ Object.freeze-ը ոչ խորն է: Եթե օբյեկտը պարունակում է հղումներ այլ օբյեկտների, այդ ներքին օբյեկտները կարող են փոփոխվել, եթե ինքներս չեն սառեցված: Գլխավոր սառեցման համար անհրաժեշտ է ռեկուրսիվ ֆունկցիա:

// Գլխավոր սառեցման օրինակ
function deepFreeze(obj) {
  Object.freeze(obj); // Սառեցնում ենք ընթացիկ օբյեկտը

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

      // Եթե հատկությունը օբյեկտ է (և ոչ null), ռեկուրսիվ սառեցնում ենք
      if (typeof prop === 'object' && prop !== null && !Object.isFrozen(prop)) {
        deepFreeze(prop);
      }
    }
  }
}

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

deepFreeze(nestedObject);
nestedObject.details.level = 2; // Չի աշխատի խիստ ռեժիմում

Համեմատական աղյուսակ:

Մեթոդ Հավելում հատկություններ Հեռացում հատկություններ Փոփոխում հատկություններ
Object.preventExtensions() Ոչ Այո Այո
Object.seal() Ոչ Ոչ Այո
Object.freeze() Ոչ Ոչ Ոչ