Skip to content

Commit

Permalink
update(JS): web/javascript/reference/global_objects/object/freeze
Browse files Browse the repository at this point in the history
  • Loading branch information
undead404 committed Jul 17, 2024
1 parent dafffdc commit 60a21e3
Showing 1 changed file with 4 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,7 @@ obj1.internal.a; // 'якесь значення'

Аби стати сталим об'єктом, весь граф посилань (безпосередні та опосередковані посилання на інші об'єкти) повинен посилатися виключно на незмінні заморожені об'єкти. Заморожений об'єкт називається незмінним через те, що _стан_ всього об'єкта (значення та посилання на інші об'єкти) всередині цілого об'єкта зафіксовано. Варто зазначити, що рядки, числа, та булеві значення завжди незмінні, а функції та масиви — це об'єкти.

#### Що означає "поверхневе заморожування"?
### Глибоке заморожування

Результат виклику `Object.freeze(object)` застосовується лише до безпосередніх властивостей об'єкта `object`, і запобігає майбутнім додаванням нових властивостей, операціям видалення чи повторного присвоєння _лише_ на цьому об'єкті. В разі, якщо ті властивості самі є об'єктами, ті об'єкти не заморожуються, і можуть бути ціллю операцій додавання або видалення властивостей, чи повторного присвоєння значення.

Expand All @@ -170,7 +170,9 @@ employee.address.city = "Нойда"; // атрибути дочірніх об'
console.log(employee.address.city); // "Нойда"
```

Аби зробити весь об'єкт незмінним — слід рекурсивно заморозити кожну з тих його властивостей, які мають об'єктний тип (глибоке замороження). Можна застосовувати цей патерн в архітектурі, залежно від конкретного випадку — якщо відомо, що об'єкт не містить [зациклень](<https://uk.wikipedia.org/wiki/%D0%A6%D0%B8%D0%BA%D0%BB_(%D1%82%D0%B5%D0%BE%D1%80%D1%96%D1%8F_%D0%B3%D1%80%D0%B0%D1%84%D1%96%D0%B2)>) у графі залежностей, бо інакше це спричинить нескінченний цикл. Певним вдосконаленням функції `deepFreeze()` було б додати внутрішню функцію, яка б отримувала аргумент (наприклад, масив Array) зі шляхом до об'єкта, щоб можна було заблокувати рекурсивний виклик `deepFreeze()` в разі, якщо об'єкт вже в процесі замороження. Проте залишиться ризик заморозити об'єкт, який заморожуватися не повинен, наприклад — [`window`](/uk/docs/Web/API/Window).
Аби зробити весь об'єкт незмінним — слід рекурсивно заморозити кожну з тих його властивостей, які мають об'єктний тип (глибоке замороження). Можна застосовувати цей патерн в архітектурі, залежно від конкретного випадку — якщо відомо, що об'єкт не містить [зациклень](<https://uk.wikipedia.org/wiki/%D0%A6%D0%B8%D0%BA%D0%BB_(%D1%82%D0%B5%D0%BE%D1%80%D1%96%D1%8F_%D0%B3%D1%80%D0%B0%D1%84%D1%96%D0%B2)>) у графі залежностей, бо інакше це спричинить нескінченний цикл. Наприклад, функції, створені за допомогою запису [`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) {
Expand Down

0 comments on commit 60a21e3

Please sign in to comment.