Object.freeze() в JavaScript

Object.freeze() замораживает объект: после этого нельзя изменить его свойства, добавить новые или удалить существующие.

let settings = {
  theme: 'dark',
  fontSize: 16,
};

Object.freeze(settings);

Такой объект остается доступным для чтения, но менять его уже нельзя.

Что делает Object.freeze()

После вызова Object.freeze() объект становится неизменяемым на верхнем уровне.

let user = {
  name: 'Анна',
  age: 28,
};

Object.freeze(user);

console.log(user.name); // Анна

Читать свойства можно как обычно. Ограничение касается изменения объекта.

Синтаксис

Object.freeze(object);

object - объект, который нужно заморозить.

let frozenUser = Object.freeze(user);

Метод возвращает замороженный объект.

Изменение свойств

Если попробовать изменить свойство замороженного объекта, значение не изменится.

let settings = {
  theme: 'dark',
};

Object.freeze(settings);

settings.theme = 'light';

console.log(settings.theme); // dark

В строгом режиме такая попытка вызовет ошибку TypeError.

'use strict';

let settings = Object.freeze({
  theme: 'dark',
});

settings.theme = 'light'; // TypeError

Поэтому лучше не рассчитывать на то, что изменение просто “не сработает”. Если объект заморожен, его нужно считать неизменяемым.

Добавление и удаление свойств

Object.freeze() запрещает не только менять существующие свойства, но и добавлять новые.

let user = {
  name: 'Анна',
};

Object.freeze(user);

user.age = 28;

console.log(user); // { name: 'Анна' }

Удалить свойство тоже не получится.

delete user.name;

console.log(user.name); // Анна

Если код работает в строгом режиме, добавление и удаление свойств у замороженного объекта также приведет к ошибке.

Метод возвращает тот же объект

Object.freeze() не создает копию объекта.

let settings = {
  theme: 'dark',
};

let frozenSettings = Object.freeze(settings);

console.log(frozenSettings === settings); // true

В переменных settings и frozenSettings лежит ссылка на один и тот же объект.

Поверхностная заморозка

Важный нюанс: Object.freeze() замораживает только сам объект, но не вложенные объекты.

let user = {
  name: 'Анна',
  address: {
    city: 'Москва',
  },
};

Object.freeze(user);

user.address.city = 'Казань';

console.log(user.address.city); // Казань

Свойство address нельзя заменить целиком, но объект внутри address остался изменяемым.

user.address = {
  city: 'Самара',
};

console.log(user.address.city); // Казань

Если нужно заморозить вложенные объекты, их нужно замораживать отдельно.

Когда использовать

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

const roles = Object.freeze({
  admin: 'admin',
  user: 'user',
  guest: 'guest',
});

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

Для обычных данных, которые нужно часто обновлять, Object.freeze() обычно не нужен.

Итого

  • Object.freeze() запрещает менять, добавлять и удалять свойства объекта.
  • Читать свойства замороженного объекта можно.
  • Метод возвращает тот же объект, а не копию.
  • В строгом режиме попытка изменить замороженный объект вызовет TypeError.
  • Заморозка поверхностная: вложенные объекты остаются изменяемыми.