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

Как сделать свойство объекта неизменяемым?

Sobes Copilot

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

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

sobes.tech AI

Сделать свойство объекта неизменяемым можно несколькими способами:

  1. Использование Object.defineProperty():

    Этот метод позволяет определить или изменить свойства объекта с болееgranularным контролем. Для создания неизменяемого свойства нужно установить дескриптор свойства с writable: false.

    const obj = {};
    Object.defineProperty(obj, 'myProperty', {
      value: 'Неизменяемое значение',
      writable: false, // Делает свойство неизменяемым
      enumerable: true, // Свойство будет видно при переборе
      configurable: true // Свойство можно будет удалить или изменить его дескриптор
    });
    
    // Попытка изменить значение будет проигнорирована в нестрогом режиме
    // и вызовет ошибку TypeError в строгом режиме
    obj.myProperty = 'Новое значение';
    console.log(obj.myProperty); // Выведет "Неизменяемое значение"
    

    Если установить configurable: false, свойство нельзя будет удалить или изменить его дескриптор (включая writable).

    const obj2 = {};
    Object.defineProperty(obj2, 'myProperty', {
      value: 'Неизменяемое и непросто удаляемое',
      writable: false,
      enumerable: true,
      configurable: false // Делает дескриптор свойства неизменяемым
    });
    
    // Попытка изменить значение
    obj2.myProperty = 'Новое значение';
    console.log(obj2.myProperty); // Выведет "Неизменяемое и непросто удаляемое"
    
    // Попытка удалить свойство
    delete obj2.myProperty;
    console.log(obj2.myProperty); // Выведет "Неизменяемое и непросто удаляемое"
    
  2. Использование Object.freeze():

    Этот метод делает объект "замороженным". Это означает, что нельзя добавлять новые свойства, удалять существующие, изменять значения существующих свойств (включая их перечислимость и конфигурируемость), а также изменять прототип объекта.

    const obj = {
      myProperty: 'Неизменяемое значение'
    };
    
    Object.freeze(obj);
    
    // Попытка изменить значение
    obj.myProperty = 'Новое значение';
    console.log(obj.myProperty); // Выведет "Неизменяемое значение"
    
    // Попытка добавить новое свойство
    obj.newProperty = 'Новое';
    console.log(obj.newProperty); // Выведет undefined
    
    // Попытка удалить свойство
    delete obj.myProperty;
    console.log(obj.myProperty); // Выведет "Неизменяемое значение"
    

    Важно отметить, что Object.freeze() поверхностное. Если свойство объекта является другим объектом, этот внутренний объект не будет заморожен.

  3. Использование const для переменных, содержащих объект:

    Ключевое слово const делает ссылку на объект неизменяемой, но не сам объект. Вы не сможете переназначить переменную на другой объект, но сможете менять свойства самого объекта.

    const obj = {
      myProperty: 'Начальное значение'
    };
    
    // Можно изменить значение свойства
    obj.myProperty = 'Новое значение';
    console.log(obj.myProperty); // Выведет "Новое значение"
    
    // Нельзя переназначить переменную
    // obj = { anotherProperty: 'Другое' }; // Вызовет TypeError
    

Сравнение методов:

Метод Что делает неизменяемым? Уровень неизменяемости
Object.defineProperty() Одно конкретное свойство Определяется дескриптором
Object.freeze() Весь объект Поверхностный
const Ссылку на объект Переменная

Выбор метода зависит от того, насколько granularной должна быть неизменяемость. Для одного свойства подходит Object.defineProperty(), для всего объекта - Object.freeze(). Для предотвращения переназначения ссылки используется const.