Этот сайт использует cookies. Продолжение работы с сайтом означает, что Вы согласны!
Методы 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
.
Помощь сайту
ЮMoney (Yandex-деньги): 410011140483022
ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов