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() Жок Жок Жок