Как да направите свойство на обект неизменяемо?
sobes.tech AI
Отговор от AI
Как да направите свойство на обект неизменяемо, може да се постигне по няколко начина:
-
Използване на
Object.defineProperty():Този метод позволява дефиниране или промяна на свойства на обект с по-фин контрол. За създаване на неизменяемо свойство трябва да зададете дескриптора на свойството с
writable: false.const obj = {}; Object.defineProperty(obj, 'myProperty', { value: 'Непроменлива стойност', writable: false, // Прави свойството неизменяемо enumerable: true, // Свойството ще бъде видимо при итерация configurable: true // Свойството може да бъде изтрито или променено }); // Опит за промяна на стойността ще бъде игнориран в нестрог режим // и ще предизвика грешка TypeError в строг режим obj.myProperty = 'Нова стойност'; console.log(obj.myProperty); // Ще изведе "Непроменлива стойност"Ако зададете
configurable: false, свойството няма да може да бъде изтрито или променено (включителноwritable).const obj2 = {}; Object.defineProperty(obj2, 'myProperty', { value: 'Непроменлива и трудно изтриваема', writable: false, enumerable: true, configurable: false // Прави дескриптора на свойството неизменяем }); // Опит за промяна на стойността obj2.myProperty = 'Нова стойност'; console.log(obj2.myProperty); // Ще изведе "Непроменлива и трудно изтриваема" // Опит за изтриване на свойството delete obj2.myProperty; console.log(obj2.myProperty); // Ще изведе "Непроменлива и трудно изтриваема" -
Използване на
Object.freeze():Този метод прави обекта "замразен". Това означава, че не може да добавяте нови свойства, да изтривате съществуващи, да променяте стойностите на съществуващи свойства (включително тяхната изброимост и конфигурируемост), както и да променяте прототипа на обекта.
const obj = { myProperty: 'Непроменлива стойност' }; Object.freeze(obj); // Опит за промяна на стойността obj.myProperty = 'Нова стойност'; console.log(obj.myProperty); // Ще изведе "Непроменлива стойност" // Опит за добавяне на ново свойство obj.newProperty = 'Ново'; console.log(obj.newProperty); // undefined // Опит за изтриване на свойството delete obj.myProperty; console.log(obj.myProperty); // Ще изведе "Непроменлива стойност"Важно е да се отбележи, че
Object.freeze()е повърхностен. Ако свойството на обекта е друг обект, този вътрешен обект няма да бъде замразен. -
Използване на
constза променливи, съдържащи обект:Ключовата дума
constправи препратката към обекта неизменяема, но не и самия обект. Не можете да пренасочите променливата към друг обект, но можете да променяте свойствата на самия обект.const obj = { myProperty: 'Начална стойност' }; // Може да промените стойността на свойството obj.myProperty = 'Нова стойност'; console.log(obj.myProperty); // "Нова стойност" // Не може да пренасочите променливата // obj = { другаСвойство: 'Друго' }; // Ще предизвика TypeError
Сравнение на методите:
| Метод | Какво прави неизменяемо? | Ниво на неизменяемост |
|---|---|---|
Object.defineProperty() |
Едно конкретно свойство | Определя се чрез дескриптор |
Object.freeze() |
Целия обект | Повърхностен |
const |
Препратка към обекта | Променлива |
Изборът на метод зависи от това, колко детайлна трябва да бъде неизменяемостта. За едно свойство е подходящо Object.defineProperty(), за цял обект - Object.freeze(). За предотвратяване на пренасочване на препратката се използва const.