1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
|
---
title: Object.defineProperties()
slug: Web/JavaScript/Reference/Global_Objects/Object/defineProperties
tags:
- ECMAScript5
- JavaScript
- JavaScript 1.8.5
- Method
- Object
- Reference
- Référence(2)
- polyfill
translation_of: Web/JavaScript/Reference/Global_Objects/Object/defineProperties
---
<div>{{JSRef("Global_Objects", "Object")}}</div>
<h2 id="Summary" name="Summary">Сводка</h2>
<p>Метод <code><strong>Object.defineProperties()</strong></code> определяет новые или изменяет существующие свойства, непосредственно на объекте, возвращая этот объект.</p>
<h2 id="Syntax" name="Syntax">Синтаксис</h2>
<pre class="syntaxbox"><code>Object.defineProperties(<var>obj</var>, <var>props</var>)</code></pre>
<h3 id="Parameters" name="Parameters">Параметры</h3>
<dl>
<dt><code>obj</code></dt>
<dd>Объект, на котором определяются новые или изменяются существующие свойства.</dd>
<dt><code>props</code></dt>
<dd>Объект, чьи собственные перечисляемые свойства представляют собой дескрипторы для создаваемых или изменяемых свойств. Дескрипторы свойств обладают следующими дополнительными ключами:
<dl>
<dt><code>configurable</code></dt>
<dd>Равен <code>true</code> только в том случае, если тип этого дескриптора свойства может быть изменён и если свойство может быть удалено из содержащего его объекта.<br>
<strong>Значение по умолчанию установлено в <code>false</code>.</strong></dd>
<dt><code>enumerable</code></dt>
<dd>Равен <code>true</code> только в том случае, если это свойство можно увидеть через перечисление свойств содержащего его объекта.<br>
<strong>Значение по умолчанию установлено в <code>false</code>.</strong></dd>
<dt><code>value</code></dt>
<dd>Значение, ассоциированное со свойством. Может быть любым допустимым значением JavaScript (числом, объектом, функцией и т.д.).<br>
<strong>Значение по умолчанию установлено в {{jsxref("Global_Objects/undefined", "undefined")}}.</strong></dd>
<dt><code>writable</code></dt>
<dd>Равен <code>true</code> только в том случае, если значение, ассоциированное со свойством, может быть изменено с помощью {{jsxref("Operators/Assignment_Operators", "оператора присваивания", "", 1)}}.<br>
<strong>Значение по умолчанию установлено в <code>false</code>.</strong></dd>
<dt><code>get</code></dt>
<dd>Функция, используемая как геттер свойства, либо {{jsxref("Global_Objects/undefined", "undefined")}}, если свойство не имеет геттера. Возвращаемое значение функции будет использоваться как значение свойства.<br>
<strong>Значение по умолчанию установлено в {{jsxref("Global_Objects/undefined", "undefined")}}.</strong></dd>
<dt><code>set</code></dt>
<dd>Функция, используемая как сеттер свойства, либо {{jsxref("Global_Objects/undefined", "undefined")}}, если свойство не имеет сеттера. Функция принимает единственным аргументом новое значение, присваиваемое свойству.<br>
<strong>Значение по умолчанию установлено в {{jsxref("Global_Objects/undefined", "undefined")}}.</strong></dd>
<dt>
<h3 id="Возвращаемое_значение">Возвращаемое значение</h3>
<p>Объект, переданный в функцию.</p>
</dt>
</dl>
</dd>
</dl>
<h2 id="Description" name="Description">Описание</h2>
<p>Метод <code>Object.defineProperties()</code>, по сути, определяет все свойства, соответствующие собственным свойствам объекта <code>props</code>, на объекте <code>obj</code>.</p>
<h2 id="Examples" name="Examples">Примеры</h2>
<pre class="brush: js">Object.defineProperties(obj, {
'property1': {
value: true,
writable: true
},
'property2': {
value: 'Hello',
writable: false
}
// и т.д.
});
</pre>
<h2 id="Polyfill" name="Polyfill">Полифилл</h2>
<p>Предполагается, что среда выполнения осталась нетронутой, все имена и свойства ссылаются на свои изначальные значения. Оригинальный метод <code>Object.defineProperties</code> почти полностью эквивалентен (смотрите комментарий в функции <code>isCallable</code>) следующей реализации на JavaScript:</p>
<pre class="brush: js; highlight: [8];">function defineProperties(obj, properties) {
function convertToDescriptor(desc) {
function hasProperty(obj, prop) {
return Object.prototype.hasOwnProperty.call(obj, prop);
}
function isCallable(v) {
// NB: изменить при необходимости считать вызываемым что-то ещё, кроме функций.
return typeof v === 'function';
}
if (typeof desc !== 'object' || desc === null) {
throw new TypeError('bad desc');
}
var d = {};
if (hasProperty(desc, 'enumerable')) {
d.enumerable = !!obj.enumerable;
}
if (hasProperty(desc, 'configurable')) {
d.configurable = !!obj.configurable;
}
if (hasProperty(desc, 'value')) {
d.value = obj.value;
}
if (hasProperty(desc, 'writable')) {
d.writable = !!desc.writable;
}
if (hasProperty(desc, 'get')) {
var g = desc.get;
if (!isCallable(g) && g !== 'undefined') {
throw new TypeError('bad get');
}
d.get = g;
}
if (hasProperty(desc, 'set')) {
var s = desc.set;
if (!isCallable(s) && s !== 'undefined') {
throw new TypeError('bad set');
}
d.set = s;
}
if (('get' in d || 'set' in d) && ('value' in d || 'writable' in d)) {
throw new TypeError('identity-confused descriptor');
}
return d;
}
if (typeof obj !== 'object' || obj === null) {
throw new TypeError('bad obj');
}
properties = Object(properties);
var keys = Object.keys(properties);
var descs = [];
for (var i = 0; i < keys.length; i++) {
descs.push([keys[i], convertToDescriptor(properties[keys[i]])]);
}
for (var i = 0; i < descs.length; i++) {
Object.defineProperty(obj, descs[i][0], descs[i][1]);
}
return obj;
}
</pre>
<h2 id="Specifications" name="Specifications">Спецификации</h2>
<table class="standard-table">
<tbody>
<tr>
<th scope="col">Спецификация</th>
<th scope="col">Статус</th>
<th scope="col">Комментарии</th>
</tr>
<tr>
<td>{{SpecName('ES5.1', '#sec-15.2.3.7', 'Object.defineProperties')}}</td>
<td>{{Spec2('ES5.1')}}</td>
<td>Изначальное определение. Реализована в JavaScript 1.8.5.</td>
</tr>
<tr>
<td>{{SpecName('ES6', '#sec-object.defineproperties', 'Object.defineProperties')}}</td>
<td>{{Spec2('ES6')}}</td>
<td> </td>
</tr>
</tbody>
</table>
<h2 id="Browser_compatibility" name="Browser_compatibility">Совместимость с браузерами</h2>
<div>{{CompatibilityTable}}</div>
<div id="compat-desktop">
<table class="compat-table">
<tbody>
<tr>
<th>Возможность</th>
<th>Firefox (Gecko)</th>
<th>Chrome</th>
<th>Internet Explorer</th>
<th>Opera</th>
<th>Safari</th>
</tr>
<tr>
<td>Базовая поддержка</td>
<td>{{CompatGeckoDesktop("2")}}</td>
<td>{{CompatChrome("5")}} (предыдущие версии не проверялись)</td>
<td>{{CompatIE("9")}}</td>
<td>{{CompatOpera("11.60")}}</td>
<td>{{CompatSafari("5")}}</td>
</tr>
</tbody>
</table>
</div>
<div id="compat-mobile">
<table class="compat-table">
<tbody>
<tr>
<th>Возможность</th>
<th>Firefox Mobile (Gecko)</th>
<th>Android</th>
<th>IE Mobile</th>
<th>Opera Mobile</th>
<th>Safari Mobile</th>
</tr>
<tr>
<td>Базовая поддержка</td>
<td>{{CompatGeckoMobile("2")}}</td>
<td>{{CompatVersionUnknown}}</td>
<td>{{CompatUnknown}}</td>
<td>{{CompatOperaMobile("11.50")}}</td>
<td>{{CompatVersionUnknown}}</td>
</tr>
</tbody>
</table>
</div>
<p>На основе <a class="external" href="http://kangax.github.com/es5-compat-table/">таблицы совместимости Kangax</a>.</p>
<h2 id="See_also" name="See_also">Смотрите также</h2>
<ul>
<li>{{jsxref("Object.defineProperty()")}}</li>
<li>{{jsxref("Object.keys()")}}</li>
<li><a href="/ru/docs/Enumerability_and_ownership_of_properties">Перечисляемость и собственность свойств</a></li>
</ul>
|