Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

update(JS): web/javascript/reference/global_objects/object/freeze #3148

Merged
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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), все ж можна заморозити.
undead404 marked this conversation as resolved.
Show resolved Hide resolved

Певним вдосконаленням функції `deepFreeze()` було б зберігати об'єкти, що вже оброблено, що можна було заблокувати рекурсивний виклик `deepFreeze()`, коли об'єкт перебуває в процесі перетворення на незмінний. Один з прикладів дивіться у [використанні `WeakSet` для відстеження циклічних посилань](/uk/docs/Web/JavaScript/Reference/Global_Objects/WeakSet#vypadok-vidstezhennia-tsyklichnykh-posylan). Проте залишиться ризик заморозити об'єкт, який заморожуватися не повинен, наприклад — [`window`](/uk/docs/Web/API/Window).
undead404 marked this conversation as resolved.
Show resolved Hide resolved

```js
function deepFreeze(object) {
Expand Down
Loading