Метод 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 функциях.