Підсумок:
const
і Object.freeze()
служать зовсім іншим цілям.
const
є для оголошення змінної, яка повинна відразу ж перейти в режим assinged і не може бути перепризначена. змінні, задекларовані const
блоком, не містять функцій, подібно до змінних, оголошених за допомогоюvar
Object.freeze()
це метод, який приймає об'єкт і повертає той самий об'єкт. Тепер об’єкт не може видалити будь-які його властивості або додати нові властивості.
Приклади const
:
Приклад 1: Неможливо перепризначити const
У наведеному нижче коді виникає помилка, оскільки ми намагаємося перепризначити змінну foo, яка була оголошена за const
ключовим словом, ми не можемо її перепризначити
Приклад 2: Структури даних, яким призначено, const
можна мутувати
const object = {
prop1: 1,
prop2: 2
}
object.prop1 = 5; // object is still mutable!
object.prop3 = 3; // object is still mutable!
console.log(object); // object is mutated
У цьому прикладі ми оголошуємо змінну за допомогою const
ключового слова та присвоюємо їй об’єкт. Хоча ми не можемо перепризначити цю змінну, яку називають об'єктом, ми можемо мутувати сам об'єкт. Якщо ми змінимо існуючі властивості або додамо нові властивості, це матиме ефект. Щоб вимкнути будь-які зміни об’єкта, які нам потрібні Object.freeze()
.
Приклади Object.freeze()
:
Приклад 1: Неможливо змінити заморожений об'єкт
object1 = {
prop1: 1,
prop2: 2
}
object2 = Object.freeze(object1);
console.log(object1 === object2); // both objects are refer to the same instance
object2.prop3 = 3; // no new property can be added, won't work
delete object2.prop1; // no property can be deleted, won't work
console.log(object2); // object unchanged
У цьому прикладі, коли ми викликаємо Object.freeze()
і наводимо object1
в якості аргументу, функція повертає об'єкт, який зараз 'заморожений'. Якщо порівнювати посилання нового об’єкта на старий об’єкт за допомогою ===
оператора, то можемо спостерігати, що вони посилаються на той самий об’єкт. Крім того, коли ми намагаємося додати або видалити будь-які властивості, ми можемо побачити, що це не має ніякого ефекту (призведе до помилки в суворому режимі).
Приклад 2: Об'єкти з посиланнями не повністю заморожені
const object = {
prop1: 1,
nestedObj: {
nestedProp1: 1,
nestedProp2: 2,
}
}
const frozen = Object.freeze(object);
frozen.prop1 = 5; // won't have any effect
frozen.nestedObj.nestedProp1 = 5; //will update because the nestedObject isn't frozen
console.log(frozen);
Цей приклад показує, що властивості вкладених об'єктів (та інших за референтними структурами даних) все ще змінюються . Таким Object.freeze()
чином, не повністю «заморожувати» об’єкт, коли у нього є властивості, які є посиланнями (наприклад, масиви, об’єкти).