Sobes.tech
Middle

როგორ შეიძლება აიკრძალოს ობიექტის ცვლილება JavaScript-ში?

sobes.tech AI

პასუხი AI-სგან

შეგიძლიათ გამოიყენოთ ინტეგრირებული მეთოდები Object:

  1. Object.preventExtensions(obj): აკრძალავს ახალი თვისებების დამატებას ობიექტზე, მაგრამ საშუალებას აძლევს შეცვალოს და წაშალოს არსებული.
  2. Object.seal(obj): აკრძალავს თვისებების დამატებას და წაშლას, მაგრამ საშუალებას აძლევს შეცვალოს არსებული. ეს ძირითადად არის preventExtensions + წაშლის აკრძალვა.
  3. Object.freeze(obj): აკრძალავს თვისებების დამატებას, წაშლას და შეცვლას. ქმნის ობიექტს არასიღრმისეულად უცვლელს. ეს არის seal + შეცვლის აკრძალვა.

გამოყენების მაგალითი:

// საწყისი ობიექტი
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() არა არა არა