aboutsummaryrefslogtreecommitdiff
path: root/files/uk/web/javascript/reference/global_objects/object/index.html
blob: 6fdb6e8adb3b482130d4788f447f26ee137bc86b (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
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
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
---
title: Object
slug: Web/JavaScript/Reference/Global_Objects/Object
tags:
  - Constructor
  - JavaScript
  - NeedsTranslation
  - Object
  - TopicStub
translation_of: Web/JavaScript/Reference/Global_Objects/Object
---
<div>{{JSRef}}</div>

<p>Клас <code><strong>Object</strong></code> відображає один з <a href="/uk/docs/Web/JavaScript/Data_structures">типів даних JavaScript</a>. Він використовується для збереження різноманітних колекцій, що використовують ключі, та більш складних сутностей. Об'єкти можуть бути створені за допомогою конструктора {{jsxref("Object/Object", "Object()")}} або <a href="/uk/docs/Web/JavaScript/Reference/Operators/Ініціалізація_об’єктів">об'єктного ініціалізатора / літерального синтаксису</a>.</p>

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

<p>Майже усі об'єкти у JavaScript є екземплярами {{jsxref("Object")}}; типовий об'єкт успадковує властивості (в тому числі методи) від <code>Object.prototype</code>, хоча ці властивості можуть бути перекриті (перевизначені). Однак, можна навмисно створити <font face="consolas, Liberation Mono, courier, monospace"><span style="background-color: rgba(220, 220, 220, 0.5);">Object</span></font>, для якого це буде не так (наприклад, за допомогою {{jsxref("Object.create", "Object.create(null)")}}), або змінити його таким чином (наприклад, через {{jsxref("Object.setPrototypeOf")}}).</p>

<p>Зміни у прототипі <code>Object</code> видимі <strong>усім</strong> об'єктам через ланцюжок прототипів, якщо властивості та методи, яких стосуються ці зміни, не були перевизначені далі у ланцюжку прототипів. Це надає дуже потужний, хоча й потенційно небезпечний, механізм для перевизначення або розширення поведінки об'єкта.</p>

<p><font face="Open Sans, Arial, sans-serif">Конструктор </font><code>Object</code> створює обгортку об'єкта для заданого значення.</p>

<ul>
 <li>Якщо значенням є {{jsxref("null")}} або {{jsxref("undefined")}}, конструктор створить та поверне порожній об'єкт.</li>
 <li>В іншому випадку, він поверне об'єкт того типу, який відповідає наданому значенню.</li>
 <li>Якщо значення вже є об'єктом, конструктор поверне це значення.</li>
</ul>

<p>Під час виклику не у контексті конструктора, <code>Object</code> поводиться ідентично до <code>new Object()</code>.</p>

<p>Дивіться також <a href="/uk/docs/Web/JavaScript/Reference/Operators/Ініціалізація_об’єктів">Ініціалізатор об'єктів / літеральний синтаксис</a>.</p>

<h3 id="Видалення_властивості_обєкта">Видалення властивості об'єкта</h3>

<p>У самому об'єкті не існує методів для видалення своїх властивостей (таких, як {{jsxref("Map.prototype.delete", "Map.prototype.delete()")}}). Щоб зробити це, необхідно скористатись <a href="/uk/docs/Web/JavaScript/Reference/Operators/delete">оператором delete</a>.</p>

<h2 id="Конструктор">Конструктор</h2>

<dl>
 <dt>{{jsxref("Object/Object", "Object()")}}</dt>
 <dd>Створює новий об'єкт <code>Object</code>. Це обгортка для наданого значення.</dd>
</dl>

<h2 id="Статичні_методи">Статичні методи</h2>

<dl>
 <dt>{{jsxref("Object.assign()")}}</dt>
 <dd>Копіює значення усіх перелічуваних особистих властивостей з одного або більше об'єктів у цільовий об'єкт.</dd>
 <dt>{{jsxref("Object.create()")}}</dt>
 <dd>Створює новий об'єкт із вказаним прототипним об'єктом і властивостями.</dd>
 <dt>{{jsxref("Object.defineProperty()")}}</dt>
 <dd>Додає зазначену властивість, описану наданим дескриптором, до об'єкта.</dd>
 <dt>{{jsxref("Object.defineProperties()")}}</dt>
 <dd>Додає зазначені властивості, описані наданими дескрипторами, до об'єкта.</dd>
 <dt>{{jsxref("Object.entries()")}}</dt>
 <dd>Повертає масив, що містить усі пари <code>[key, value]</code> <strong>особистих</strong> перелічуваних рядкових властивостей данного  об'єкта.</dd>
 <dt>{{jsxref("Object.freeze()")}}</dt>
 <dd>Заморожує об'єкт: інший код не може видаляти або змінювати будь-які властивості.</dd>
 <dt>{{jsxref("Object.fromEntries()")}}</dt>
 <dd>Повертає новий об'єкт з ітерабельного об'єкта, що містить пари ключ-значення (зворотний до {{jsxref("Object.entries")}}).</dd>
 <dt>{{jsxref("Object.getOwnPropertyDescriptor()")}}</dt>
 <dd>Повертає дескриптор властивості для зазначенної властивості об'єкта.</dd>
 <dt>{{jsxref("Object.getOwnPropertyDescriptors()")}}</dt>
 <dd>Повертає об'єкт, що містить дескриптори всіх особистих властивостей об'єкта.</dd>
 <dt>{{jsxref("Object.getOwnPropertyNames()")}}</dt>
 <dd>Повертає масив, що містить імена всіх <strong>особистих</strong> перелічуваних і неперелічуванних властивостей даного об'єкта.</dd>
 <dt>{{jsxref("Object.getOwnPropertySymbols()")}}</dt>
 <dd>Повертає масив усіх символьних властивостей, знайдених безпосередньо на даному об'єкті.</dd>
 <dt>{{jsxref("Object.getPrototypeOf()")}}</dt>
 <dd>Повертає прототип вказаного об'єкта.</dd>
 <dt>{{jsxref("Object.is()")}}</dt>
 <dd>Перевіряє, чи мають два аргументи однакове значення. Прирівнює усі значення NaN (що відрізняється як від абстрактної рівності, так і від строгої рівності).</dd>
 <dt>{{jsxref("Object.isExtensible()")}}</dt>
 <dd>Визначає, чи дозволене розширення об'єкта.</dd>
 <dt>{{jsxref("Object.isFrozen()")}}</dt>
 <dd>Визначає, чи є об'єкт замороженим.</dd>
 <dt>{{jsxref("Object.isSealed()")}}</dt>
 <dd>Визначає, чи є об'єкт запечатанним.</dd>
 <dt>{{jsxref("Object.keys()")}}</dt>
 <dd>Повертає масив, що містить імена всіх <strong>особистих</strong> перелічуваних рядкових властивостей даного об'єкта.</dd>
 <dt>{{jsxref("Object.preventExtensions()")}}</dt>
 <dd>Запобігає будь-яким розширенням об'єкта.</dd>
 <dt>{{jsxref("Object.seal()")}}</dt>
 <dd>Запобігає можливості іншого коду видаляти властивості об'єкта.</dd>
 <dt>{{jsxref("Object.setPrototypeOf()")}}</dt>
 <dd>Встановлює прототип (тобто, внутрішню властивість <code>[[Prototype]]</code> об'єкта).</dd>
 <dt>{{jsxref("Object.values()")}}</dt>
 <dd>Повертає масив, який містить значення, що відповідають усім <strong>особистим</strong> перелічуваним рядковим властивостям даного об'єкта.</dd>
</dl>

<h2 id="Властивості_екземплярів">Властивості екземплярів </h2>

<dl>
 <dt>{{jsxref("Object.prototype.constructor")}}</dt>
 <dd>Визначає функцію, що створює прототип об'єкта.</dd>
 <dt>{{jsxref("Object.prototype.proto","Object.prototype.__proto__")}}</dt>
 <dd>Вказує на об'єкт, що був використаний як прототип, коли створювався екземпляр об'єкта.</dd>
 <dt>{{jsxref("Object.prototype.noSuchMethod","Object.prototype.__noSuchMethod__")}}</dt>
 <dd>Дозволяє визначити функцію, яка буде виконуватись, коли на об'єкті викликатиметься неіснуючий елемент.</dd>
</dl>

<h2 id="Методи_екземплярів">Методи екземплярів</h2>

<dl>
 <dt>{{jsxref("Object.prototype.__defineGetter__()")}}</dt>
 <dd>Прив'язує функцію до властивості, яка, під час звернення до неї, викликатиме цю функцію та повертатиме значення, яке повернула функція.</dd>
 <dt>{{jsxref("Object.prototype.__defineSetter__()")}}</dt>
 <dd>Прив'язує функцію до властивості, яка, під час присвоєння, виконує цю функцію, яка змінює властивість.</dd>
 <dt>{{jsxref("Object.prototype.__lookupGetter__()")}}</dt>
 <dd>Повертає функцію, прив'язану до вказаної властивості методом {{jsxref("Object.prototype.__defineGetter__()", "__defineGetter__()")}}.</dd>
 <dt>{{jsxref("Object.prototype.__lookupSetter__()")}}</dt>
 <dd>Повертає функцію, прив'язану до вказаної властивості методом {{jsxref("Object.prototype.__defineSetter__()", "__defineSetter__()")}}.</dd>
 <dt>{{jsxref("Object.prototype.hasOwnProperty()")}}</dt>
 <dd>Повертає булеве значення, що вказує, чи об'єкт містить вказану властивість як особисту властивість цього об'єкта, а не успадковану через ланцюжок прототипів.</dd>
 <dt>{{jsxref("Object.prototype.isPrototypeOf()")}}</dt>
 <dd>Повертає булеве значення, що вказує, чи присутній об'єкт, на якому викликається цей метод, у ланцюжку прототипів вказаного об'єкта.</dd>
 <dt>{{jsxref("Object.prototype.propertyIsEnumerable()")}}</dt>
 <dd>Повертає булеве значення, що вказує, чи встановлений внутрішній <a href="/uk/docs/Web/JavaScript/Data_structures#Properties">атрибут ECMAScript [[Enumerable]]</a>.</dd>
 <dt>{{jsxref("Object.prototype.toLocaleString()")}}</dt>
 <dd>Викликає {{jsxref("Object.toString", "toString()")}}.</dd>
 <dt>{{jsxref("Object.prototype.toString()")}}</dt>
 <dd>Повертає рядок, що відображає об'єкт.</dd>
 <dt>{{jsxref("Object.prototype.unwatch()")}}</dt>
 <dd>Прибирає точку спостереження з властивості об'єкта.</dd>
 <dt>{{jsxref("Object.prototype.valueOf()")}}</dt>
 <dd>Повертає просту величину вказаного об'єкта.</dd>
 <dt>{{jsxref("Object.prototype.watch()")}} {{non-standard_inline}}</dt>
 <dd>Додає точку спостереження до властивості об'єкта.</dd>
</dl>

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

<h3 id="Використання_Object_з_типами_undefined_та_null">Використання <code>Object</code> з типами <code>undefined</code> та <code>null</code></h3>

<p>Наступні приклади зберігають порожній об'єкт <code>Object</code> в <code>o</code>:</p>

<pre class="brush: js notranslate">var o = new Object();
</pre>

<pre class="brush: js notranslate">var o = new Object(undefined);
</pre>

<pre class="brush: js notranslate">var o = new Object(null);
</pre>

<h3 id="Використання_Object_для_створення_обєктів_Boolean">Використання <code>Object</code> для створення об'єктів <code>Boolean</code></h3>

<p>Наступні приклади зберігають об'єкти {{jsxref("Boolean")}} у <code>o</code>:</p>

<pre class="brush: js notranslate">// еквівалентно до o = new Boolean(true);
var o = new Object(true);
</pre>

<pre class="brush: js notranslate">// еквівалентно до o = new Boolean(false);
var o = new Object(Boolean());
</pre>

<h3 id="Прототипи_обєктів">Прототипи об'єктів</h3>

<p>Змінюючи поведінку існуючих методів <code>Object.prototype</code>, розгляньте включення коду додаванням вашого розширення до чи після існуючої логіки. Наприклад, цей (неперевірений) код буде попередньо виконувати власну логіку перед тим, як буде виконано вбудовану логіку або інше розширення.</p>

<p>Коли викликається функція, аргументи виклику містяться у подібній до масиву "змінній" <a href="/uk/docs/Web/JavaScript/Reference/Functions/arguments">arguments</a>. Наприклад, у виклику <code>myFn(a, b, c)</code>, arguments, що знаходиться у тілі <code>myFn</code>, міститиме 3 подібні до масиву елементи, що відповідають <code>(a, b, c)</code>.</p>

<p>Модифікуючи прототипи з хуками, просто передайте <code>this</code> та arguments (стан виклику) до поточної поведінки, викликавши <code>apply()</code> на функції. Цей шаблон може використовуватись для будь-яких прототипів, наприклад, <code>Node.prototype</code>, <code>Function.prototype</code>, і т. д.</p>

<pre class="brush: js notranslate">var current = Object.prototype.valueOf;

// Оскільки моя властивість "-prop-value" є наскрізною та не завжди
// знаходиться в тому самому ланцюжку прототипів, я хочу змінити Object.prototype:
Object.prototype.valueOf = function() {
  if (this.hasOwnProperty('-prop-value')) {
    return this['-prop-value'];
  } else {
    // Це не схоже на один з моїх об'єктів, тому повернемось
    // до початкової поведінки, відтворивши поточну поведінку якнайкраще.
    // Метод apply поводиться як "super" у деяких інших мовах.
    // І хоча valueOf() не приймає аргументів, можливо, інший хук їх прийматиме.
    return current.apply(this, arguments);
  }
}</pre>

<p>Оскільки JavaScript, насправді, не має об'єктів підкласу, прототип є зручним обхідним рішенням для створення об'єкта у ролі "базового класу" з певними функціями, що діють як об'єкти. Наприклад:</p>

<pre class="brush: js notranslate">var Person = function(name) {
  this.name = name;
  this.canTalk = true;
};

Person.prototype.greet = function() {
  if (this.canTalk) {
    console.log('Привіт, я ' + this.name);
  }
};

var Employee = function(name, title) {
  Person.call(this, name);
  this.title = title;
};

Employee.prototype = Object.create(Person.prototype);

Employee.prototype.greet = function() {
  if (this.canTalk) {
    console.log('Привіт, я ' + this.name + ', ' + this.title);
  }
};

var Customer = function(name) {
  Person.call(this, name);
};

Customer.prototype = Object.create(Person.prototype);

var Mime = function(name) {
  Person.call(this, name);
  this.canTalk = false;
};

Mime.prototype = Object.create(Person.prototype);

var bob = new Employee('Боб', 'будівельник');
var joe = new Customer('Джо');
var rg = new Employee('Ред Грін', 'майстер на всі руки');
var mike = new Customer('Майк');
var mime = new Mime('Мім');

bob.greet();
// Привіт, я Боб, будівельник

joe.greet();
// Привіт, я Джо

rg.greet();
// Привіт, я Ред Грін, майстер на всі руки

mike.greet();
// Привіт, я Майк

mime.greet();</pre>

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

<table class="standard-table">
 <tbody>
  <tr>
   <th scope="col">Специфікація</th>
  </tr>
  <tr>
   <td>{{SpecName('ESDraft', '#sec-object-objects', 'Object')}}</td>
  </tr>
 </tbody>
</table>

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

<div class="hidden">
<p>The compatibility table on this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p>
</div>

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

<h2 id="Дивіться_також">Дивіться також</h2>

<ul>
 <li><a href="/uk/docs/Web/JavaScript/Reference/Operators/Ініціалізація_об’єктів">Ініціалізатор об'єктів</a></li>
</ul>