0Pricing
JavaScript Academy · Урок

Безопасное объединение объектов, заморозка и запечатывание

Объединяйте объекты без неожиданностей, избегайте загрязнения прототипа и защищайте данные с помощью Object.freeze и Object.seal

«Безопасное объединение объектов, заморозка и запечатывание» — бесплатный урок JavaScript Academy на CoddyKit. Это урок 2 из 3. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения JavaScript Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс JavaScript Academy содержит 3 уроков всего.

Зачем нужно безопасное объединение

Цель: безопасно объединять объекты и защищать состояние.

  • Выполняйте поверхностное объединение с помощью оператора расширения или Object.assign
  • Предотвращайте загрязнение прототипа, фильтруя ключи
  • Используйте Object.create(null) для безопасных целевых объектов
  • Используйте freeze и seal, чтобы блокировать изменения объектов
Безопасное объединение объектов, заморозка и запечатывание — иллюстрация 1

Поверхностное объединение (оператор расширения)

Используйте оператор расширения (или Object.assign({}, a, b)), чтобы создать новый объект; не изменяйте исходные данные.

// Shallow merge with spread keeps sources unchanged
const a = { x: 1, y: 2 };
const b = { y: 9, z: 3 };

// Later keys win on conflicts
const merged1 = { ...a, ...b };

console.log("a:", a);
console.log("b:", b);
console.log("merged1:", merged1);
Безопасное объединение объектов, заморозка и запечатывание — иллюстрация 2

Как избежать загрязнения прототипа

Если ключи поступают извне, составьте небольшой список разрешённых или запрещённых ключей и используйте Object.create(null) в качестве целевого объекта.

// Avoid prototype pollution: use a null-prototype target and skip special keys
function safeMergeUntrusted(pairs) {
  // target has no prototype
  const out = Object.create(null);

  // keys to skip
  const BLOCK = new Set(["__proto__", "prototype", "constructor"]);

  for (const [k, v] of pairs) {
    if (typeof k !== "string") continue;
    if (BLOCK.has(k)) continue;
    out[k] = v;
  }
  return out;
}

const inputPairs = [
  ["name", "Ayla"],
  ["__proto__", { hacked: true }],
  ["role", "user"]
];

const safe = safeMergeUntrusted(inputPairs);

console.log("safe.name:", safe.name);
console.log("safe.role:", safe.role);
console.log("safe.__proto__ is undefined?", safe.__proto__ === undefined);
Безопасное объединение объектов, заморозка и запечатывание — иллюстрация 3

Клонирование + assign

Object.assign({}, ...) — это безопасный шаблон, который начинающим легко читать.

// Object.assign can also create a new object
const base = { a: 1, b: 2 };
const patch = { b: 5 };

// New object as first arg → sources untouched
const merged2 = Object.assign({}, base, patch);

console.log("base:", base);
console.log("patch:", patch);
console.log("merged2:", merged2);
Безопасное объединение объектов, заморозка и запечатывание — иллюстрация 4

freeze и seal

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

// Freeze: no add/remove/change
const frozen = Object.freeze({ id: 1, tag: "locked" });
// Seal: no add/remove, but you may change existing values
const sealed = Object.seal({ id: 2, tag: "open" });

// Attempts (silently fail in non-strict mode)
frozen.tag = "new";
sealed.tag = "updated";
sealed.newKey = 123;

console.log("frozen:", frozen);
console.log("sealed:", sealed);
Безопасное объединение объектов, заморозка и запечатывание — иллюстрация 5

Безопасные привычки при объединении

Советы:

  • Предпочитайте новые объекты: {...a, ...b} или Object.assign({}, a, b).
  • Для ненадёжных ключей используйте Object.create(null) и пропускайте __proto__, prototype, constructor.
  • Защищайте конфигурации с помощью Object.freeze, а модели — с помощью Object.seal.
Безопасное объединение объектов, заморозка и запечатывание — иллюстрация 6

Тест по основам загрязнения прототипа

Быстрая проверка: самый безопасный целевой объект для объединения с ненадёжными данными.

Безопасное объединение объектов, заморозка и запечатывание — иллюстрация 7

Повторение

Повторение: создавайте новые объекты при объединении, фильтруйте ненадёжные ключи и используйте freeze/seal для защиты важных структур данных.

Безопасное объединение объектов, заморозка и запечатывание — иллюстрация 8

Часто задаваемые вопросы

Урок «Безопасное объединение объектов, заморозка и запечатывание» бесплатный?

Да — полный текст урока «Безопасное объединение объектов, заморозка и запечатывание» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс JavaScript Academy, подпишись на CoddyKit PRO. Курс JavaScript Academy содержит 3 уроков всего.

Чему я научусь в уроке «Безопасное объединение объектов, заморозка и запечатывание»?

Объединяйте объекты без неожиданностей, избегайте загрязнения прототипа и защищайте данные с помощью Object.freeze и Object.seal Ты практикуешь JavaScript Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать JavaScript Academy?

Предыдущий опыт не требуется. JavaScript Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 3.

Сколько времени занимает урок «Безопасное объединение объектов, заморозка и запечатывание»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке JavaScript Academy?

Да. Каждый урок JavaScript Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Проверка входных данных и основы экранирования
  2. Безопасное объединение объектов, заморозка и запечатывание
  3. Границы ошибок (концептуально) без фреймворков
← Назад к JavaScript Academy