Как предотвратить модификацию объекта в JavaScript?
Содержание
Существует множество способов блокировки объекта в соответствии с вашими потребностями.
- Object.freeze()
- Object.seal()
- Object.preventExtensions()
Object.freeze()
Чтобы предотвратить модификацию объектов JavaScript, одним из методов является использование Object.freeze(). Замораживание объекта не позволяет добавлять новые объекты к объекту и не позволяет удалить или изменить существующие свойства. Любая попытка сделать это потерпит неудачу, либо тихо, либо выбросив исключение TypeError (чаще всего, но не исключительно, в строгом режиме).
Синтаксис
Object.freeze(obj)
Пример
var student = { name: "John", age: 10 };
Object.freeze(student);
student.grade = 2; // Выдает ошибку в строгом режиме
document.write(student.grade); // не определено
document.write("
");
delete student.age; // удалить свойство
document.write(student.age);
document.write("
");
student.name = "Doe";
document.write(student.name);
Выход
undefined 10 John
Замораживание объекта может быть полезно для представления логически неизменяемой структуры данных, особенно если изменение свойств объекта может привести к плохому поведению в другом месте вашего приложения. Object.freeze (...) неглубоко, это означает, что значения объекта в замороженном объекте по-прежнему изменяемы.
Object.seal()
Object.seal - это надмножество Object.preventExtensions в функциональности, поскольку в то же время он предотвращает привязку произвольных свойств к объектам, а также предотвращает изменение атрибутов свойств, которые уже существуют на объекте. Кроме того, он запрещает удаление свойств.
Синтаксис
Object.seal(obj)
Пример
var student = { name: "John", age: 10 };
Object.seal(student);
student.grade = 2; // добавить новое свойство
document.write(student.grade); // не определено
document.write("
");
student.name = "Doe";
document.write(student.name);
document.write("
"); // Doe
delete student.age;
document.write(student.age); // 10
document.write("
");
Выход
undefined Doe 10
Object.preventExtensions()
Object.preventExtensions() устанавливает расширяемый атрибут o в false, чтобы новые свойства не добавлялись к нему. Это постоянное изменение: после того, как объект был сделан не расширяемым, он не может быть снова расширяемым.
Пример
var student = { name: "John", age: 10 };
Object.preventExtensions(student);
document.write(Object.isExtensible(student));
document.write("
");
student.grade = 2; // добавить новое свойство
document.write(student.grade); // не определено
document.write("
");
Выход
false undefined
