[ITEM 4] QUESTION: Як зробити об'єкт незмінним?
Забезпечення незмінності даних — часте завдання в розробці на JavaScript, особливо під час роботи з парадигмами функціонального програмування або керуванням станом. У мові передбачено кілька рівнів захисту об'єктів від змін, кожен із яких вирішує свої завдання з різним ступенем суворості.
Найрадикальнішим методом є Object.freeze(). Цей метод здійснює повне заморожування об'єкта: у нього не можна додавати нові властивості, видаляти наявні, а також змінювати їхні значення чи дескриптори (writable і configurable встановлюються в false). Однак важливо пам'ятати, що заморожування є поверхневим, тобто якщо властивість об'єкта сама є вкладеним об'єктом, то внутрішній об'єкт залишиться змінним, якщо не застосувати до нього заморожування рекурсивно.
Проміжний рівень захисту надає метод Object.seal(). Він робить об'єкт запечатаним: забороняє додавання нових властивостей і видалення наявних, але залишає можливість змінювати значення вже наявних властивостей, якщо їхній прапорець writable дорівнює true. Ще м'якший варіант — Object.preventExtensions(), який забороняє лише додавання нових властивостей, залишаючи все інше без змін.
Для перевірки поточного стану захищеності об'єктів у JavaScript передбачені спеціальні булеві методи: Object.isFrozen(), Object.isSealed() та Object.isExtensible(). Розуміння різниці між цими методами дозволяє розробникам вибирати оптимальний рівень захисту даних залежно від архітектурних вимог додатка, запобігаючи випадковим мутаціям стану в складних логічних ланцюжках.