Sobes.tech
Middle

JavaScript-də obyektin dəyişdirilməsini necə qadağan etmək olar?

sobes.tech Süni İntellekt

AI-dan cavab

İçəridəki Object metodlarından istifadə edə bilərsiniz:

  1. Object.preventExtensions(obj): Obyektdə yeni xüsusiyyətlərin əlavə edilməsini qadağan edir, lakin mövcud olanların dəyişdirilməsinə və silinməsinə icazə verir.
  2. Object.seal(obj): Xüsusiyyətlərin əlavə edilməsini və silinməsini qadağan edir, lakin mövcud olanların dəyişdirilməsinə icazə verir. Əslində, bu preventExtensions + silmənin qadağan edilməsidir.
  3. Object.freeze(obj): Xüsusiyyətlərin əlavə edilməsini, silinməsini və dəyişdirilməsini qadağan edir. Obyekti dərinlikdə dəyişməz edir. Bu, seal + mövcud xüsusiyyətlərin dəyişdirilməsinin qadağan edilməsidir.

İstifadə nümunəsi:

// Başlanğıc obyekt
let myObject = { name: 'Alice', age: 30 };

// preventExtensions
Object.preventExtensions(myObject);
myObject.city = 'London'; // Katı rejimdə işləməz, yumşaq rejimdə isə nəzərə alınmaz.

// seal
let mySealedObject = { name: 'Bob', age: 25 };
Object.seal(mySealedObject);
mySealedObject.age = 26; // İşləyəcək
delete mySealedObject.name; // Katı rejimdə işləməz.
mySealedObject.city = 'Paris'; // Katı rejimdə işləməz.

// freeze
let myFrozenObject = { name: 'Charlie', age: 35 };
Object.freeze(myFrozenObject);
myFrozenObject.age = 36; // Katı rejimdə işləməz.
delete myFrozenObject.name; // Katı rejimdə işləməz.
myFrozenObject.city = 'New York'; // Katı rejimdə işləməz.

Vacib: Object.freeze yüngül səviyyədədir. Əgər obyekt başqa obyektlərə istinadlar ehtiva edirsə, bu iç-içə obyektlər dəyişdirilə bilər, əgər onlar da dondurulmayıbsa. Dərin dondurma üçün rekursiv funksiya tələb olunur.

// Dərin dondurma nümunəsi
function deepFreeze(obj) {
  Object.freeze(obj); // Mövcud obyekti dondur

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

      // Əgər xüsusiyyət obyekt isə (null deyil), onu rekursiv dondur
      if (typeof prop === 'object' && prop !== null && !Object.isFrozen(prop)) {
        deepFreeze(prop);
      }
    }
  }
}

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

deepFreeze(nestedObject);
nestedObject.details.level = 2; // Katı rejimdə işləməz.

Müqayisə cədvəli:

Metod Xüsusiyyətlərin əlavə olunması Xüsusiyyətlərin silinməsi Xüsusiyyətlərin dəyişdirilməsi
Object.preventExtensions() Yox Bəli Bəli
Object.seal() Yox Yox Bəli
Object.freeze() Yox Yox Yox