Sobes.tech
Middle

JavaScriptda ob'ektni o'zgartirishni qanday taqiqlash mumkin?

sobes.tech AI

AIdan javob

Siz Object ning ichki metodlarini ishlatishingiz mumkin:

  1. Object.preventExtensions(obj): Ob'ektga yangi xususiyatlar qo'shilishini taqiqlaydi, ammo mavjudlarini o'zgartirish va o'chirishga ruxsat beradi.
  2. Object.seal(obj): Xususiyatlarni qo'shish va o'chirishni taqiqlaydi, ammo mavjudlarini o'zgartirishga ruxsat beradi. Aslida, bu preventExtensions + o'chirishni taqiqlash.
  3. Object.freeze(obj): Xususiyatlarni qo'shish, o'chirish va o'zgartirishni taqiqlaydi. Ob'ektni chuqur o'zgarmas qiladi. Bu seal + mavjud xususiyatlarni o'zgartirishni taqiqlash.

Foydalanish misoli:

// Asosiy ob'ekt
let myObject = { name: 'Alice', age: 30 };

// preventExtensions
Object.preventExtensions(myObject);
myObject.city = 'London'; // Katı rejimda ishlamaydi, yumshoq rejimda e'tiborsiz qoldiriladi.

// seal
let mySealedObject = { name: 'Bob', age: 25 };
Object.seal(mySealedObject);
mySealedObject.age = 26; // Ishlaydi
delete mySealedObject.name; // Katı rejimda ishlamaydi.
mySealedObject.city = 'Paris'; // Katı rejimda ishlamaydi.

// freeze
let myFrozenObject = { name: 'Charlie', age: 35 };
Object.freeze(myFrozenObject);
myFrozenObject.age = 36; // Katı rejimda ishlamaydi.
delete myFrozenObject.name; // Katı rejimda ishlamaydi.
myFrozenObject.city = 'New York'; // Katı rejimda ishlamaydi.

Muhim: Object.freeze yuzaki. Agar ob'ekt boshqa ob'ektlarga havolalar saqlasa, bu ichki ob'ektlar o'zgartirilishi mumkin, agar ular o'zlari ham muzlatilmagan bo'lsa. Chuqur muzlatish uchun rekursiv funksiya kerak.

// Chuqur muzlatish misoli
function deepFreeze(obj) {
  Object.freeze(obj); // Ob'ektni muzlatadi

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

      // Agar xususiyat ob'ekt bo'lsa (null emas), uni rekursiv ravishda muzlatadi
      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ı rejimda ishlamaydi.

Taqqoslash jadvali:

Metod Xususiyatlar qo'shish Xususiyatlarni o'chirish Xususiyatlarni o'zgartirish
Object.preventExtensions() Yo'q Ha Ha
Object.seal() Yo'q Yo'q Ha
Object.freeze() Yo'q Yo'q Yo'q