ES6 представил новое объявление под названием const
для объявления переменных как содержащих постоянные (т.е. неизменяемые) значения.
Вот определение const
из веб-документов MDN.
Константы имеют блочную область видимости, как и переменные, определенные с помощью оператора
let
. Значение константы не может измениться путем переназначения и не может быть повторно объявлено.
Это означает, что если вы объявите переменную как const
, она станет значением только для чтения, и вы не сможете изменить ее значение после первоначального присвоения. Это приведет к ошибке, как показано ниже:
Но происходит интересная вещь, когда мы объявляем объект как значение const
.
Хотя вы не можете изменить значение объекта, вы все равно можете обновить значения его свойств!
Как видно на изображении выше, переменная с именем stationaryBox
объявлена как const
. Итак, когда вы пытаетесь заменить значение объекта, выдает ошибку. Однако вы по-прежнему можете получить доступ к значениям свойств объекта (например, ключ pencils
в приведенном выше примере) и обновить их по отдельности. То же самое происходит при объявлении массива как const
.
Тогда как вы действительно можете предотвратить обновление объекта?
Есть несколько способов сделать это в сочетании с объявлением const
:
1) Использование дескрипторов свойств объекта
Каждое свойство объекта определяется 3 дескрипторами:
a) перечисляемое: если true, свойство будет перечислено в циклах
b) перезаписываемое: если true , значение свойства может быть изменено
c) настраивается : если true, дескрипторы свойства могут быть изменены
Таким образом, мы можем предотвратить обновление объекта, установив значение дескриптора на writable:false, configurable: false
для всех свойств объекта, как показано ниже:
const stationaryBox = { pencils: 2, pens: 3, eraser: 1 }; Object.defineProperties(stationaryBox, { pencils: {enumerable: true, writable: false, configurable: false}, pens: {enumerable: true, writable: false, configurable: false}, eraser: {enumerable: true, writable: false, configurable: false} });
2) Использование Object.freeze()
Вместо установки writable: false, configurable: false
для каждого свойства существует метод Object
с именем freeze()
, который вы можете использовать и который делает то же самое, что и выше, для всех свойств объекта.
const stationaryBox = { pencils: 2, pens: 3, eraser: 1 }; Object.freeze(stationaryBox);
Если вместо этого вы хотите просто предотвратить добавление новых свойств, вы можете использовать Object.preventExtensions(obj)
. Чтобы предотвратить как добавление, так и удаление свойств, вы можете использовать Object.seal(obj)
.