Метод Object.defineProperties - позволяет устанавливать нескольким свойствам некоторые настройки (можно ли свойства изменять, удалять и др.)
Принцип работы этого метода аналогичен Object.defineProperty. Но в Object.defineProperties можно указывать сразу несколько свойств.
См. также Object.defineProperty.
Синтаксис
Object.defineProperties(объект, {
cвойство 1: дескриптор 1,
cвойство 2: дескриптор 2,
...
cвойство n: дескриптор n,
});
Дескриптор - это объект, который описывает поведение свойства. В нем могут быть следующие свойства (в скобках указаны значения по умолчанию):
value //значение свойства (undefined)
writable //если true - свойство можно перезаписывать (false)
configurable // если true, то свойство можно удалять (false)
enumerable //если true, то свойство видно в цикле for..in (false)
get //Функции, которая возвращает значение свойства (undefined)
set //Функции, которая записывает значение свойства (undefined);
Если со свойством произвести запрещеное действие, например, попытаться изменить в то время как writable = false, то ничего не произойдет (а в строгом режиме (при указании 'use strict') - будет ошибка). Также запрещено указывать value/writeble если указаны get/set.
Примеры
Пример
Свойство созданое обычным способом не имеет никаких необычных свойств - его можно перезаписывать, удалять и одно видно в for..in. Давайте создадим 2 свойства, которые нельзя удалять:
var obj = {
val1: 10, //Обычное свойство
}
Object.defineProperties(obj, {
val2: {
value: 20,
configurable: false,
},
val3: {
value: 30,
configurable: false,
}
});
alert(obj.val1) //10
alert(obj.val2) //20
alert(obj.val3) //30
delete obj.val1
delete obj.val2
delete obj.val3
alert(obj.val1) //undefined
alert(obj.val2) //20
alert(obj.val3) //30
В данном примере свойство val1 создано обычным способом, и после удаления - оно удалилось. Но val2 и val3 запрещено удалять, поэтому они остались.
Пример
В данном примере создадим объект квадрата со свойствами: ширина, периметр и площадь. При этом указывать будем только ширину, остальные свойства буду выводиться на ее основании:
var square = {
size: 5,
}
Object.defineProperties(square, {
p: {
get: function() {
return this.size * 4;
},
set: function(p)
{
this.size = p / 4;
}
},
S: {
get: function() {
return this.size * this.size;
},
set: function(S) {
this.size = Math.sqrt(S);
}
}
});
alert(square.size) //5
alert(square.p) //20
alert(square.S) //25
square.size = 10;
alert(square.size) //10
alert(square.p) //40
alert(square.S) //100
square.p = 100
alert(square.size) //25
alert(square.p) //100
alert(square.S) //625
square.S = 100
alert(square.size) //10
alert(square.p) //40
alert(square.S) //100
В этом примере мы создали объект square со свойством size. А также создали свойства p, S с помощью Object.defineProperty. В результате при изменении одного свойства меняются значения всех остальных. Точнее свойства p, S всегда вычисляются на основании size по указанных в get/set функциях.