Запретить модификацию объекта в JavaScript
ECMAScript 5 представляет несколько методов для предотвращения модификации объекта, которые блокируют объект, чтобы гарантировать, что никто случайно или иным образом не изменит функциональность объекта.
Существует три уровня предотвращения модификации:
1: Предотвратить расширения:
К объекту нельзя добавить новые свойства или методы, но можно изменить существующие свойства и метод.
Например:
var employee = {
name: "Nishant"
};
// lock the object
Object.preventExtensions(employee);
// Now try to change the employee object property name
employee.name = "John"; // work fine
//Now try to add some new property to the object
employee.age = 24; // fails silently unless it's inside the strict mode
2: Печать:
Это то же самое, что и предотвращение расширения, в дополнение к этому также предотвращается удаление существующих свойств и методов.
Чтобы запечатать объект, мы используем метод Object.seal(). вы можете проверить, запечатан объект или нет, используя Object.isSealed();
var employee = {
name: "Nishant"
};
// Seal the object
Object.seal(employee);
console.log(Object.isExtensible(employee)); // false
console.log(Object.isSealed(employee)); // true
delete employee.name // fails silently unless it's in strict mode
// Trying to add new property will give an error
employee.age = 30; // fails silently unless in strict mode
когда объект запечатан, его существующие свойства и методы не могут быть удалены. Запечатанный объект также не является расширяемым.
3: Заморозить:
То же, что и печать. В дополнение к этому предотвращается изменение существующих методов свойств (все свойства и методы доступны только для чтения).
Чтобы заморозить объект, используйте метод Object.freeze(). Мы также можем определить, заморожен ли объект, используя Object.isFrozen();
var employee = {
name: "Nishant"
};
//Freeze the object
Object.freeze(employee);
// Seal the object
Object.seal(employee);
console.log(Object.isExtensible(employee)); // false
console.log(Object.isSealed(employee)); // true
console.log(Object.isFrozen(employee)); // true
employee.name = "xyz"; // fails silently unless in strict mode
employee.age = 30; // fails silently unless in strict mode
delete employee.name // fails silently unless it's in strict mode
Замороженные объекты считаются как нерасширяемыми, так и запечатанными.
Рекомендуемые:
Если вы решили предотвратить модификацию, запечатать, заморозить объект, то используйте в строгом режиме, чтобы вы могли отловить ошибку.
Например:
"use strict";
var employee = {
name: "Nishant"
};
//Freeze the object
Object.freeze(employee);
// Seal the object
Object.seal(employee);
console.log(Object.isExtensible(employee)); // false
console.log(Object.isSealed(employee)); // true
console.log(Object.isFrozen(employee)); // true
employee.name = "xyz"; // fails silently unless in strict mode
employee.age = 30; // fails silently unless in strict mode
delete employee.name; // fails silently unless it's in strict mode