Назад к вопросам
Middle
113
questionbank

Как можно запретить изменение объекта в JavaScript?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech 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() Нет Нет Нет