diff --git a/files/uk/web/javascript/reference/global_objects/object/freeze/index.md b/files/uk/web/javascript/reference/global_objects/object/freeze/index.md index b02385dbff..abde5fa2f5 100644 --- a/files/uk/web/javascript/reference/global_objects/object/freeze/index.md +++ b/files/uk/web/javascript/reference/global_objects/object/freeze/index.md @@ -148,7 +148,7 @@ obj1.internal.a; // 'якесь значення' Аби стати сталим об'єктом, весь граф посилань (безпосередні та опосередковані посилання на інші об'єкти) повинен посилатися виключно на незмінні заморожені об'єкти. Заморожений об'єкт називається незмінним через те, що _стан_ всього об'єкта (значення та посилання на інші об'єкти) всередині цілого об'єкта зафіксовано. Варто зазначити, що рядки, числа, та булеві значення завжди незмінні, а функції та масиви — це об'єкти. -#### Що означає "поверхневе заморожування"? +### Глибоке заморожування Результат виклику `Object.freeze(object)` застосовується лише до безпосередніх властивостей об'єкта `object`, і запобігає майбутнім додаванням нових властивостей, операціям видалення чи повторного присвоєння _лише_ на цьому об'єкті. В разі, якщо ті властивості самі є об'єктами, ті об'єкти не заморожуються, і можуть бути ціллю операцій додавання або видалення властивостей, чи повторного присвоєння значення. @@ -170,7 +170,9 @@ employee.address.city = "Нойда"; // атрибути дочірніх об' console.log(employee.address.city); // "Нойда" ``` -Аби зробити весь об'єкт незмінним — слід рекурсивно заморозити кожну з тих його властивостей, які мають об'єктний тип (глибоке замороження). Можна застосовувати цей патерн в архітектурі, залежно від конкретного випадку — якщо відомо, що об'єкт не містить [зациклень]() у графі залежностей, бо інакше це спричинить нескінченний цикл. Певним вдосконаленням функції `deepFreeze()` було б додати внутрішню функцію, яка б отримувала аргумент (наприклад, масив Array) зі шляхом до об'єкта, щоб можна було заблокувати рекурсивний виклик `deepFreeze()` в разі, якщо об'єкт вже в процесі замороження. Проте залишиться ризик заморозити об'єкт, який заморожуватися не повинен, наприклад — [`window`](/uk/docs/Web/API/Window). +Аби зробити весь об'єкт незмінним, слід рекурсивно заморозити кожну з тих його властивостей, які мають об'єктний тип (глибоке замороження). Можна застосовувати цей патерн в архітектурі, залежно від конкретного випадку, якщо відомо, що об'єкт не містить [зациклень]() у графі залежностей, бо інакше це спричинить нескінченний цикл. Наприклад, функції, створені за допомогою запису [`function`](/uk/docs/Web/JavaScript/Reference/Statements/function), мають властивість [`prototype`](/uk/docs/Web/JavaScript/Reference/Global_Objects/Function/prototype) із властивістю `constructor`, що вказує на саму функцію, тобто вони усталено мають зациклення. Інші функції, як от [стрілкові](/uk/docs/Web/JavaScript/Reference/Functions/Arrow_functions), все ж можна заморозити. + +Певним вдосконаленням функції `deepFreeze()` було б зберігати об'єкти, що вже оброблено, щоб можна було заблокувати рекурсивний виклик `deepFreeze()`, коли об'єкт перебуває в процесі перетворення на незмінний. Один з прикладів дивіться у [використанні `WeakSet` для відстеження циклічних посилань](/uk/docs/Web/JavaScript/Reference/Global_Objects/WeakSet#vypadok-vidstezhennia-tsyklichnykh-posylan). Проте залишиться ризик заморозити об'єкт, який заморожуватися не повинен, наприклад, [`window`](/uk/docs/Web/API/Window). ```js function deepFreeze(object) {