Блокировка изменений объекта
как уберечь объект JavaScript от изменений с помощью методов preventExtensions, seal, freeze и ключевого слова const
В 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”