«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Изменяемость объектов в Javascript

Изменяемость объектов в Javascript

Опубликовано 19 августа 2024 г.
Просматривать:795

Object Mutability in Javascript

Изменяемость объекта

Изменчивость — это возможность изменять значение. Изменяемое значение можно изменить, а неизменяемое значение изменить нельзя. Распространенным заблуждением является то, что ключевое слово const делает переменную неизменяемой.

константа

На самом деле, const предотвращает только переназначение. Для типов, не являющихся объектами, значения можно изменить только путем переназначения, поэтому объявление их с помощью «const» фактически делает их неизменяемыми. Рассмотрим, например, следующий код:

const num = 5;
num = 7; // illegal reassignment of const variable

В этом коде невозможно изменить значение num. Обратите внимание, что использование или -- по-прежнему считается переназначением, и это указывается в сообщении об ошибке, если мы пытаемся использовать их для переменной, объявленной с помощью const.

const num = 5;
num  ;//illegal reassignment of constant

Результирующая ошибка:

Uncaught TypeError: Assignment to constant variable.

константные объекты могут быть изменяемыми

Объекты принципиально отличаются в отношении изменчивости тем, что их значения могут изменяться без переназначения переменной. Обратите внимание, что переназначение свойств не предотвращается с помощью «const». Переназначение запрещено только для имени переменной.

const obj = {num: 5};
obj.num = 7; //legal
obj = {num: 7}; //illegal reassignment 

Объекты также могут иметь методы, изменяющие внутренние значения.

const obj = {
    num: 5,
    increment(){
        this.num  ;
    }
}
obj.increment();
console.log(obj.num); //6

Делаем объект неизменяемым

Можно сделать объект фактически неизменяемым, объявив его с помощью «const» и используя Object.freeze().

const obj = {num: 5};
Object.freeze(obj);
obj.num = 7; // doesn't change
console.log(obj.num);// still 5

Обратите внимание, что если мы используем строгий режим, попытка изменить значение num фактически приведет к сбою со следующим сообщением об ошибке:

Cannot assign to read only property 'num'

Использования Object.freeze() без const уже достаточно, чтобы сделать этот объект неизменяемым. Однако это не делает имя переменной неизменяемым.

let obj = {num: 5};
Object.freeze(obj);
obj = {num: 5}; // new object with old name
obj.num = 7; // changes successfully
console.log(obj.num);// 7

В этой версии кода происходит переназначение объекта obj. Функция Freeze() была применена к предыдущему объекту с тем же именем, но новый объект никогда не был заморожен, поэтому он является изменяемым.

Герметизация объектов

Иногда вам может потребоваться разрешить изменение значений объекта, но вы не хотите разрешать добавление или удаление свойств. Этого можно добиться с помощью Object.seal().

let obj = {num: 5};
Object.seal(obj);
obj.num = 7; // changes
console.log(obj.num);// 7
obj.newValue = 42; //cannot add new property to sealed object
console.log(obj.newValue);//undefined
delete obj.num; //cannot delete property from sealed object
console.log(obj.num);// still exists and is 7

Детальный контроль

Заморозка и запечатывание применяются ко всему объекту. Если вы хотите сделать определенные свойства неизменяемыми, это можно сделать с помощью defineProperty() или defineProperties(). Выбор между этими двумя зависит от того, хотите ли вы повлиять на одно свойство или на несколько свойств.

const obj = {};
Object.defineProperty(obj, 'num',{
    value: 5,
    writable: false,
    configurable: false
});
obj.num = 7; // Cannot change value because writable is false
delete obj.num; // Cannot delete because configurable is false
console.log(obj.num);//Still exists and is 5

В этом примере определяется новое свойство, но метод defineProperty() также можно использовать для существующего свойства. Обратите внимание: если для параметра «configurable» ранее было установлено значение false, его нельзя изменить на true, но если оно изначально было true, ему можно установить значение false, поскольку это изменение считается типом настройки.

Заключение

В большинстве случаев вам не нужно гарантировать, что объект является неизменяемым. При возникновении такой необходимости, как правило, достаточно заморозить объект, но у нас есть дополнительные возможности для более тонкого контроля, если такая необходимость возникнет.

Заявление о выпуске Эта статья воспроизведена по адресу: https://dev.to/chooking/object-mutability-in-javascript-1nk4?1. Если есть какие-либо нарушения, свяжитесь с [email protected], чтобы удалить их.
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3