Как сделать свойство объекта неизменяемым?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Сделать свойство объекта неизменяемым можно несколькими способами:
-
Использование
Object.defineProperty():Этот метод позволяет определить или изменить свойства объекта с болееgranularным контролем. Для создания неизменяемого свойства нужно установить дескриптор свойства с
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 = { anotherProperty: 'Другое' }; // Вызовет TypeError
Сравнение методов:
| Метод | Что делает неизменяемым? | Уровень неизменяемости |
|---|---|---|
Object.defineProperty() |
Одно конкретное свойство | Определяется дескриптором |
Object.freeze() |
Весь объект | Поверхностный |
const |
Ссылку на объект | Переменная |
Выбор метода зависит от того, насколько granularной должна быть неизменяемость. Для одного свойства подходит Object.defineProperty(), для всего объекта - Object.freeze(). Для предотвращения переназначения ссылки используется const.