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() Не Не Не