aboutsummaryrefslogtreecommitdiff
path: root/files/uk/web/javascript/reference/global_objects/object/defineproperties/index.html
blob: 342fea9106863db1144bd411af30cd5de52e813c (plain)
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
---
title: Object.defineProperties()
slug: Web/JavaScript/Reference/Global_Objects/Object/defineProperties
tags:
  - ECMAScript 5
  - JavaScript
  - Object
  - метод
translation_of: Web/JavaScript/Reference/Global_Objects/Object/defineProperties
---
<div>{{JSRef}}</div>

<p>Метод <code><strong>Object.defineProperties()</strong></code> визначає нові або модифікує існуючі властивості прямо на об'єкті, вертаючи цей об'єкт.</p>

<div>{{EmbedInteractiveExample("pages/js/object-defineproperties.html")}}</div>



<h2 id="Синтаксис">Синтаксис</h2>

<pre class="syntaxbox"><code>Object.defineProperties(<var>obj</var>, <var>props</var>)</code></pre>

<h3 id="Параметри">Параметри</h3>

<dl>
 <dt><code><var>obj</var></code></dt>
 <dd>Об'єкт, на якому визначаються чи модифікуються властивості.</dd>
 <dt><code><var>props</var></code></dt>
 <dd>Об'єкт, чиї ключі відображають імена властивостей, які треба визначити чи модифікувати, і чиї значення є об'єктами, що описують ці властивості. Кожне значення у <code>props</code> має бути або дескриптором даних, або дескриптором доступу; воно не може бути обома (детальніше читайте у {{jsxref("Object.defineProperty()")}}).</dd>
 <dd>Дескриптори даних та дескриптори доступу можуть мати наступні необов'язкові ключі:</dd>
 <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>
 </dl>

 <p>Дескриптор даних також має наступні необов'язкові ключі:</p>

 <dl>
  <dt><code>value</code></dt>
  <dd>Значення, пов'язане з властивістю. Може бути будь-яким з чинних значень JavaScript (числом, об'єктом, функцією і т.д.).<br>
  <strong>За замовчуванням {{jsxref("undefined")}}.</strong></dd>
  <dt><code>writable</code></dt>
  <dd>Дорівнює <code>true</code> тоді й тільки тоді, коли значення, пов'язане з властивістю, може бути змінене {{jsxref("Operators/Оператори_присвоєння", "оператором присвоєння", "", 1)}}.<br>
  <strong>За замовчуванням <code>false</code>.</strong></dd>
 </dl>

 <p>Дескриптор доступу також має наступні необов'язкові ключі:</p>

 <dl>
  <dt><code>get</code></dt>
  <dd>Функція, що виступає властивістю-гетером, або {{jsxref("undefined")}}, якщо гетера немає. Значення, що повертає функція, буде використане як значення властивості.<br>
  <strong>За замовчуванням {{jsxref("undefined")}}.</strong></dd>
  <dt><code>set</code></dt>
  <dd>Функція, що виступає властивістю-сетером, або {{jsxref("undefined")}}, якщо сетера немає. Функція буде отримувати єдиним аргументом нове значення, що призначається властивості.<br>
  <strong>За замовчуванням {{jsxref("undefined")}}.</strong></dd>
 </dl>

 <p>Якщо в дескриптора немає жодного з ключів <code>value</code>, <code>writable</code>, <code>get</code> або <code>set</code>, він сприймається як дескриптор даних. Якщо дескриптор має і <code>value</code> або <code>writable</code>, і <code>get</code> або <code>set</code>, викидається виняток.</p>
 </dd>
</dl>

<h3 id="Значення_що_повертається">Значення, що повертається</h3>

<p>Об'єкт, переданий у функцію.</p>

<h2 id="Опис">Опис</h2>

<p>Метод <code>Object.defineProperties</code>, по суті, визначає всі властивості у відповідності до власних перелічуваних властивостей <code>props</code> на об'єкті <code>obj</code>.</p>

<h2 id="Приклад">Приклад</h2>

<pre class="brush: js">var obj = {};
Object.defineProperties(obj, {
  'property1': {
    value: true,
    writable: true
  },
  'property2': {
    value: 'Привіт',
    writable: false
  }
  // і т.д., і т.п.
});
</pre>

<h2 id="Поліфіл">Поліфіл</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) {
      // Увага: відредагуйте за необхідності, якщо інші значення, крім функцій, доступні для виклику.
      return typeof v === 'function';
    }

    if (typeof desc !== 'object' || desc === null)
      throw new TypeError('bad desc');

    var d = {};

    if (hasProperty(desc, 'enumerable'))
      d.enumerable = !!desc.enumerable;
    if (hasProperty(desc, 'configurable'))
      d.configurable = !!desc.configurable;
    if (hasProperty(desc, 'value'))
      d.value = desc.value;
    if (hasProperty(desc, 'writable'))
      d.writable = !!desc.writable;
    if (hasProperty(desc, 'get')) {
      var g = desc.get;

      if (!isCallable(g) &amp;&amp; typeof g !== 'undefined')
        throw new TypeError('bad get');
      d.get = g;
    }
    if (hasProperty(desc, 'set')) {
      var s = desc.set;
      if (!isCallable(s) &amp;&amp; typeof s !== 'undefined')
        throw new TypeError('bad set');
      d.set = s;
    }

    if (('get' in d || 'set' in d) &amp;&amp; ('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 &lt; keys.length; i++)
    descs.push([keys[i], convertToDescriptor(properties[keys[i]])]);

  for (var i = 0; i &lt; descs.length; i++)
    Object.defineProperty(obj, descs[i][0], descs[i][1]);

  return obj;
}
</pre>

<h2 id="Специфікації">Специфікації</h2>

<table class="standard-table">
 <thead>
  <tr>
   <th scope="col">Специфікація</th>
   <th scope="col">Статус</th>
   <th scope="col">Коментар</th>
  </tr>
 </thead>
 <tbody>
  <tr>
   <td>{{SpecName('ESDraft', '#sec-object.defineproperties', 'Object.defineProperties')}}</td>
   <td>{{Spec2('ESDraft')}}</td>
   <td></td>
  </tr>
  <tr>
   <td>{{SpecName('ES6', '#sec-object.defineproperties', 'Object.defineProperties')}}</td>
   <td>{{Spec2('ES6')}}</td>
   <td></td>
  </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>
 </tbody>
</table>

<h2 id="Сумісність_з_веб-переглядачами">Сумісність з веб-переглядачами</h2>



<p>{{Compat("javascript.builtins.Object.defineProperties")}}</p>

<h2 id="Див._також">Див. також</h2>

<ul>
 <li>{{jsxref("Object.defineProperty()")}}</li>
 <li>{{jsxref("Object.keys()")}}</li>
 <li><a href="/uk/docs/Web/JavaScript/Перелічуваність_та_належність_властивостей">Перелічуваність та належність властивостей</a></li>
</ul>