dr.Brain

doctor Brain

мир глазами веб-разработчика

Блокировка изменений объекта

как уберечь объект JavaScript от изменений с помощью методов preventExtensions, seal, freeze и ключевого слова const

dr.Brain

время чтения 2 мин.

Photo by Ian Keefe on Unsplash

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

Итак, давайте разберем, какие ограничения можно применить к JavaScript-объекту:

const

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

const myObject = {
  firstProp: true,
  secondProp: 'Yes'
}
myObject = false            // нельзя переопределить
delete myObject.firstProp   // можно удалить свойство объекта
myObject.secondProp = 'No'  // можно изменить свойство объекта
myObject.thirdProp = 'Yes'  // можно добавить свойство объекта

preventExtensions

Для более строгих ограничений Вы можете воспользоваться методами стандартного встроенного объекта Object. preventExtensions - метод, накладывающий ограничения на свойства объекта. Он запрещает добавлять новые свойства к объекту. При этом уже существующие свойства все еще можно изменять и удалять:

const myObject = {
  firstProp: true,
  secondProp: 'Yes'
}
Object.preventExtensions(myObject);
myObject.isExtensible()     // false
myObject = false            // нельзя переопределить
delete myObject.firstProp   // можно удалить свойство объекта
myObject.secondProp = 'No'  // можно изменить свойство объекта
myObject.thirdProp = 'Yes'  // нельзя добавить свойство объекта

seal

Следующий метод - seal. Он запрещает добавлять новые и удалять существующие свойства объекта. При этом возможно изменение существующих свойств объекта:

const myObject = {
  firstProp: true,
  secondProp: 'Yes'
}
Object.seal(myObject);
myObject.isSealed()         // true
myObject = false            // нельзя переопределить
delete myObject.firstProp   // нельзя удалить свойство объекта
myObject.secondProp = 'No'  // можно изменить свойство объекта
myObject.thirdProp = 'Yes'  // нельзя добавить свойство объекта

freeze

И, наконец, метод freeze. Он запрещает любые изменения свойств объекта. В данном случае можно быть уверенным, что исходные параметры объекта останутся неизменными:

const myObject = {
  firstProp: true,
  secondProp: 'Yes'
}
Object.freeze(myObject);
myObject.isFrozen()         // true
myObject = false            // нельзя переопределить
delete myObject.firstProp   // нельзя удалить свойство объекта
myObject.secondProp = 'No'  // нельзя изменить свойство объекта
myObject.thirdProp = 'Yes'  // нельзя добавить свойство объекта

Спасибо за внимание.


По материалам статьи Jeroen Ouwehand “JavaScript — Prevent objects from being changed”

Новые публикации

Далее

Категории

О нас

Frontend & Backend. Статьи, обзоры, заметки, код, уроки.