Learn JavaScript

Object.freeze() - метод для заморозки объекта в JavaScript

Object.freeze() замораживает объект.

После этого у объекта нельзя:

  • добавлять новые свойства
  • удалять существующие свойства
  • менять значения существующих свойств
  • перенастраивать дескрипторы свойств

Синтаксис

Object.freeze(obj)

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

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

Метод делает объект неизменяемым на верхнем уровне.

const user = {
  name: "Anna",
};

Object.freeze(user);

user.name = "Ivan";
user.age = 25;

console.log(user); // { name: "Anna" }

После заморозки изменения уже не применяются.

Что возвращает Object.freeze()

Object.freeze() возвращает тот же самый объект.

const user = { name: "Anna" };
const result = Object.freeze(user);

console.log(result === user); // true

Это важно: метод не создаёт новый объект, а замораживает существующий.

Нельзя менять существующие свойства

После freeze() нельзя переписать значение уже существующего свойства.

const settings = {
  theme: "dark",
};

Object.freeze(settings);

settings.theme = "light";

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

Нельзя добавлять новые свойства

const user = {
  name: "Anna",
};

Object.freeze(user);

user.age = 25;

console.log(user.age); // undefined

Нельзя удалять свойства

const user = {
  name: "Anna",
};

Object.freeze(user);

delete user.name;

console.log(user.name); // "Anna"

В strict mode будет ошибка

В обычном режиме такие операции обычно просто не срабатывают.

В строгом режиме JavaScript выбросит ошибку.

"use strict";

const user = { name: "Anna" };

Object.freeze(user);

// user.name = "Ivan"; // TypeError

Это полезно знать, если код выполняется в модуле или в строгом режиме.

Object.freeze() работает поверхностно

Это один из самых важных нюансов.

Заморозка защищает только сам объект, но не вложенные объекты внутри него.

const user = {
  name: "Anna",
  address: {
    city: "Moscow",
  },
};

Object.freeze(user);

user.address.city = "Paris";

console.log(user.address.city); // "Paris"

Сам user заморожен, но вложенный объект address остался обычным.

Как сделать глубокую заморозку

Сам по себе Object.freeze() этого не делает.

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

const user = {
  name: "Anna",
  address: {
    city: "Moscow",
  },
};

Object.freeze(user);
Object.freeze(user.address);

В реальном коде для глубокой заморозки обычно нужна отдельная функция.

Массивы и Object.freeze()

Массив тоже является объектом, поэтому метод работает и с ним.

const numbers = [1, 2, 3];

Object.freeze(numbers);

numbers.push(4);
numbers[0] = 10;

console.log(numbers); // [1, 2, 3]

После заморозки массив нельзя менять через push(), pop(), присваивание по индексу и похожие методы.

Как проверить заморозку

Для этого есть Object.isFrozen().

const user = { name: "Anna" };

Object.freeze(user);

console.log(Object.isFrozen(user)); // true

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

Object.freeze() и Object.seal()

Эти методы похожи, но работают по-разному.

Object.seal():

  • запрещает добавлять и удалять свойства
  • но обычно позволяет менять значения существующих свойств

Object.freeze():

  • делает объект жёстче
  • дополнительно запрещает менять значения существующих свойств

То есть freeze() строже, чем seal().

Object.freeze() и const

Это тоже разные вещи.

const user = { name: "Anna" };

user.name = "Ivan";

console.log(user.name); // "Ivan"

const запрещает переназначить переменную, но не защищает содержимое объекта.

const user = { name: "Anna" };

Object.freeze(user);

user.name = "Ivan";

console.log(user.name); // "Anna"

Если нужна защита самого объекта, одного const недостаточно.

Когда это полезно

Object.freeze() удобно использовать, когда:

  • нужно защитить объект от случайных изменений
  • хочется явно зафиксировать конфиг или набор констант
  • важно сделать объект неизменяемым на верхнем уровне

Пример:

const config = Object.freeze({
  apiUrl: "/api",
  version: 1,
});

Частые ошибки

Думать, что Object.freeze() создаёт новый объект

const user = { name: "Anna" };
const result = Object.freeze(user);

console.log(result === user); // true

Метод работает с тем же самым объектом.

Считать, что заморозка глубокая

const user = {
  profile: { city: "Moscow" },
};

Object.freeze(user);

user.profile.city = "Paris";

Вложенный объект внутри всё ещё можно изменить.

Путать Object.freeze() и const

const user = { name: "Anna" };

user.name = "Ivan";

const сам по себе не замораживает объект.

Быстрая памятка

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

Коротко

Object.freeze() - это способ запретить изменение объекта в JavaScript. Главное, что стоит запомнить: метод не создаёт копию, замораживает существующий объект и защищает только верхний уровень, а не всю вложенную структуру целиком.