В чем разница между Object.freeze() и Object.seal()?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Разница между Object.freeze() и Object.seal()
Основные различия
Object.freeze() и Object.seal() — это методы для защиты объектов от изменений, но они работают на разных уровнях контроля. Оба метода делают объект нежелезным, но степень защиты отличается.
Object.seal()
Object.seal() позволяет изменять существующие свойства, но запрещает добавлять новые и удалять старые свойства:
const user = { name: 'Alice', age: 30 };
Object.seal(user);
// Можно изменять существующие свойства
user.name = 'Bob'; // OK
user.age = 31; // OK
console.log(user); // { name: 'Bob', age: 31 }
// Нельзя добавлять новые свойства
user.email = 'bob@example.com'; // Ошибка в strict mode, молча игнорируется в обычном режиме
// Нельзя удалять свойства
delete user.name; // Ошибка в strict mode, молча игнорируется в обычном режиме
Object.freeze()
Object.freeze() полностью замораживает объект: нельзя менять, добавлять или удалять свойства. Объект становится полностью неизменяемым:
const user = { name: 'Alice', age: 30 };
Object.freeze(user);
// Нельзя изменять свойства
user.name = 'Bob'; // Ошибка в strict mode, молча игнорируется
user.age = 31; // Ошибка в strict mode, молча игнорируется
// Нельзя добавлять новые свойства
user.email = 'bob@example.com'; // Ошибка в strict mode, молча игнорируется
// Нельзя удалять свойства
delete user.name; // Ошибка в strict mode, молча игнорируется
console.log(user); // { name: 'Alice', age: 30 } — объект не изменился
Сравнительная таблица
| Операция | Object.seal() | Object.freeze() |
|---|---|---|
| Изменение существующих свойств | Разрешено | Запрещено |
| Добавление новых свойств | Запрещено | Запрещено |
| Удаление свойств | Запрещено | Запрещено |
| Вложенные объекты | Не защищены | Не защищены |
Проверка статуса объекта
Для проверки того, что произошло с объектом, используются специальные методы:
const user = { name: 'Alice' };
console.log(Object.isSealed(user)); // false
console.log(Object.isFrozen(user)); // false
Object.seal(user);
console.log(Object.isSealed(user)); // true
console.log(Object.isFrozen(user)); // false
Object.freeze(user);
console.log(Object.isSealed(user)); // true (frozen объект считается sealed)
console.log(Object.isFrozen(user)); // true
console.log(Object.isExtensible(user)); // false (оба метода запрещают расширение)
Поверхностная защита
Важно помнить: оба метода защищают только верхний уровень объекта. Вложенные объекты остаются мутируемыми:
const config = {
app: 'MyApp',
database: { host: 'localhost', port: 5432 }
};
Object.freeze(config);
// Нельзя менять корневые свойства
config.app = 'NewApp'; // Ошибка в strict mode
// Но можно менять вложенный объект!
config.database.host = '192.168.1.1'; // OK!
console.log(config.database.host); // '192.168.1.1'
Для глубокой заморозки нужно рекурсивно применить freeze:
function deepFreeze(obj) {
Object.freeze(obj);
Object.getOwnPropertyNames(obj).forEach(prop => {
if (obj[prop] !== null && typeof obj[prop] === 'object') {
deepFreeze(obj[prop]);
}
});
return obj;
}
const config = {
app: 'MyApp',
database: { host: 'localhost', port: 5432 }
};
deepFreeze(config);
config.database.host = '192.168.1.1'; // Ошибка в strict mode
Практическое применение
Object.seal() используется когда:
- Вы хотите зафиксировать структуру объекта
- Нужно разрешить изменение значений существующих свойств
- Нужна умеренная защита от ошибок
const userSettings = { theme: 'dark', language: 'en' };
Object.seal(userSettings);
// Можно менять значения: userSettings.theme = 'light'
// Нельзя добавлять новые: userSettings.notifications = true
Object.freeze() используется когда:
- Нужна полная неизменяемость (константные данные)
- Вы работаете с конфигурациями, которые не должны меняться
- Нужно предотвратить случайные мутации
const API_CONFIG = Object.freeze({
BASE_URL: 'https://api.example.com',
TIMEOUT: 5000
});
// Ничего нельзя менять
Производительность
Оба метода работают с примерно одинаковой скоростью, но:
- Замороженные/sealed объекты позволяют движку JavaScript оптимизировать доступ к свойствам
- При правильном использовании это может улучшить производительность
- Вложенные глубокой заморозки могут быть дорогостоящими для больших структур