Ограничение доступа к объекту

Статический метод freeze(<Объект>) из класса Object позволяет сделать объект доступным только для чтения. Нельзя будет изменить значения свойств и их атрибутов, добавить или удалить свойство. Однако можно менять значения свойств вложенных объектов, при условии, что они не "заморожены" отдельно. Попытка изменения объекта в строгом режиме приведет к исключению. Метод возвращает ссылку на объект.

Проверить, "заморожен" ли объект, позволяет статический метод isFrozen(<Объект>) из класса Object. Метод возвращает значение true, если объект "заморожен", и false — в противном случае.

Пример:

let obj = {
   a: 10,
   set c(value) {
      this._c = value;
   },
   get c() {
      return this._c;
   },
   _c: 0
};
console.log(obj);   // { a: 10, c: [Getter/Setter], _c: 0 }
console.log( Object.isFrozen(obj) ); // false
Object.freeze(obj);
console.log( Object.isFrozen(obj) ); // true
obj.a = 22;         // Нельзя изменить значение
console.log(obj);   // { a: 10, c: [Getter/Setter], _c: 0 }
delete obj.a;       // Нельзя удалить свойство
console.log(obj);   // { a: 10, c: [Getter/Setter], _c: 0 }
// Object.defineProperty(obj, 'b', { value: 14});
// TypeError: Cannot define property b, object is not extensible
// Нельзя добавить свойство или изменить атрибуты
console.log(obj);   // { a: 10, c: [Getter/Setter], _c: 0 }
obj.c = 10;         // Setter не изменяет значение
console.log(obj.c); // 0
console.log(obj);   // { a: 10, c: [Getter/Setter], _c: 0 }
// Можно изменять вложенные объекты
obj = Object.freeze({ a: { b: 5 }});
obj.a.b = 3;
console.log(obj);   // { a: { b: 3 } }

Статический метод seal(<Объект>) из класса Object запечатывает объект. Нельзя будет добавить новое свойство и удалить существующее, т. к. метод делает все свойства не настраиваемыми (атрибут configurable имеет значение false). При этом можно менять значения свойств. Setter может изменить значение существующего свойства, но не может добавить новое свойство. Метод возвращает ссылку на объект.

Проверить, является ли объект запечатанным, позволяет статический метод isSealed(<Объект>) из класса Object. Метод возвращает значение true, если объект является запечатанным, и false — в противном случае.

Пример:

let obj = {
   a: 10,
   set c(value) {
      this._c = value;
   },
   get c() {
      return this._c;
   },
   _c: 0
};
console.log(obj);   // { a: 10, c: [Getter/Setter], _c: 0 }
console.log( Object.isSealed(obj) ); // false
Object.seal(obj);
console.log( Object.isSealed(obj) ); // true
delete obj.a;       // Нельзя удалить свойство
console.log(obj);   // { a: 10, c: [Getter/Setter], _c: 0 }
// Object.defineProperty(obj, 'b', { value: 14});
// TypeError: Cannot define property b, object is not extensible
// Нельзя добавить свойство
console.log(obj);   // { a: 10, c: [Getter/Setter], _c: 0 }
obj.a = 22;         // Можно изменить значение
console.log(obj);   // { a: 22, c: [Getter/Setter], _c: 0 }
obj.c = 10;
// Setter изменяет значение, только если не нужно добавлять свойство
console.log(obj.c); // 10
console.log(obj);   // { a: 22, c: [Getter/Setter], _c: 10 }

Статический метод preventExtensions(<Объект>) из класса Object запрещает расширение объекта. Нельзя будет добавить новое свойство. При этом можно менять значения свойств и удалять их. Метод возвращает ссылку на объект.

Проверить, можно ли расширять объект путем добавления новых свойств, позволяет статический метод isExtensible(<Объект>) из класса Object. Метод возвращает значение true, если объект является расширяемым, и false — в противном случае.

Пример:

let obj = { a: 10 };
console.log(obj);   // { a: 10 }
console.log( Object.isExtensible(obj) ); // true
Object.preventExtensions(obj);
console.log( Object.isExtensible(obj) ); // false
obj.a = 22;         // Можно изменить значение
console.log(obj);   // { a: 22 }
delete obj.a;       // Можно удалить свойство
console.log(obj);   // {}
// Object.defineProperty(obj, 'b', { value: 14});
// TypeError: Cannot define property b, object is not extensible
// Нельзя добавить свойство
console.log(obj);   // {}

При использовании методов freeze() и seal() объект становится не расширяемым:

let obj1 = { a: 10 }, obj2 = { b: 3 };
Object.freeze(obj1);
console.log( Object.isExtensible(obj1) ); // false
Object.seal(obj2);
console.log( Object.isExtensible(obj2) ); // false

Учебник по Node.js и JavaScript
Учебник по JavaScript (Node.js) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов