Методы defineProperty() и defineProperties()

Для управления атрибутами свойства после создания объекта, можно воспользоваться статическим методом defineProperty(<Объект>, <Имя свойства>, <Настройки>) из класса Object. Метод возвращает ссылку на объект. Пример:

let obj = Object.create(Object.prototype, {
   'a': {
      value: 10,
      writable: true,
      enumerable: true,
      configurable: true
   }
});
// Добавление нового свойства
Object.defineProperty(obj, 'b', {
   value: 22,
   writable: true,
   configurable: true,
   enumerable: true
});
console.log( obj.b ); // 22
// Изменение атрибутов существующего свойства
console.log( obj.propertyIsEnumerable('a') ); // true
Object.defineProperty(obj, 'a', { enumerable: false });
console.log( obj.propertyIsEnumerable('a') ); // false
// Setter и getter
Object.defineProperty(obj, 'c', {
   set: function(value) {
      this._c = value;
   },
   get: function() {
      return this._c;
   }
});
obj.c = 34;
console.log( obj.c ); // 34

Как видно из примера, метод defineProperty() позволяет добавить новое свойство, setter и getter. При добавлении свойства атрибуты writable, configurable и enumerable по умолчанию устанавливаются в значение false. Метод позволяет также изменить значения атрибутов существующего свойства. Следует учитывать, что попытка изменить свойство при опции configurable, имеющей значение false, приведет к исключению:

let obj = Object.create(Object.prototype, {
   'a': {
      value: 10,
      writable: true,
      configurable: false,
      enumerable: true
   }
});
Object.defineProperty(obj, 'a', { enumerable: false });
// TypeError: Cannot redefine property: a

Однако в этом случае можно изменить значение атрибута writable на false.

Object.defineProperty(obj, 'a', { writable: false }); // OK

Метод defineProperty() позволяет за один раз добавить или изменить лишь одно свойство. Чтобы иметь возможность добавить или изменить сразу несколько свойств, следует воспользоваться статическим методом defineProperties(<Объект>, <Опции>) из класса Object. Параметр <Опции> аналогичен одноименному параметру метода create(). Метод defineProperties() возвращает ссылку на объект. Пример:

let obj = Object.create(Object.prototype, {
   'a': {
      value: 10,
      writable: true,
      enumerable: true,
      configurable: true
   }
});
Object.defineProperties(obj, {
   // Добавление нового свойства
   'b': {
      value: 22,
      writable: true,
      configurable: true,
      enumerable: true
   },
   // Изменение атрибутов существующего свойства
   'a': { enumerable: false },
   // Setter и getter
   'c': {
      set: function(value) {
         this._c = value;
      },
      get: function() {
         return this._c;
      }
   }
});
console.log( obj.b ); // 22
console.log( obj.propertyIsEnumerable('a') ); // false
obj.c = 34;
console.log( obj.c ); // 34

При добавлении свойства атрибуты writable, configurable и enumerable по умолчанию устанавливаются в значение false. Попытка изменить свойство при опции configurable, имеющей значение false, приведет к исключению. Однако в этом случае можно изменить значение атрибута writable на false.

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

Помощь сайту

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

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