Безопасное объединение объектов, заморозка и запечатывание
Объединяйте объекты без неожиданностей, избегайте загрязнения прототипа и защищайте данные с помощью Object.freeze и Object.seal
«Безопасное объединение объектов, заморозка и запечатывание» — бесплатный урок JavaScript Academy на CoddyKit. Это урок 2 из 3. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения JavaScript Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс JavaScript Academy содержит 3 уроков всего.
Зачем нужно безопасное объединение
Цель: безопасно объединять объекты и защищать состояние.
- Выполняйте поверхностное объединение с помощью оператора расширения или Object.assign
- Предотвращайте загрязнение прототипа, фильтруя ключи
- Используйте Object.create(null) для безопасных целевых объектов
- Используйте freeze и seal, чтобы блокировать изменения объектов

Поверхностное объединение (оператор расширения)
Используйте оператор расширения (или 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);

Как избежать загрязнения прототипа
Если ключи поступают извне, составьте небольшой список разрешённых или запрещённых ключей и используйте 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);

Клонирование + 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);

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);

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

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

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

Часто задаваемые вопросы
Урок «Безопасное объединение объектов, заморозка и запечатывание» бесплатный?
Да — полный текст урока «Безопасное объединение объектов, заморозка и запечатывание» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 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 — локальная установка не требуется.
Все уроки этого курса
- Проверка входных данных и основы экранирования
- Безопасное объединение объектов, заморозка и запечатывание
- Границы ошибок (концептуально) без фреймворков