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
|
---
title: instanceof
slug: Web/JavaScript/Reference/Operators/instanceof
tags:
- JavaScript
- Object
- Об'єкт
- Оператор
translation_of: Web/JavaScript/Reference/Operators/instanceof
---
<div>{{jsSidebar("Operators")}}</div>
<p><strong>Оператор</strong> <strong><code>instanceof</code></strong> перевіряє, чи присутня властивість конструктора <code>prototype</code> десь у ланцюжку прототипів об'єкта.</p>
<div>{{EmbedInteractiveExample("pages/js/expressions-instanceof.html")}}</div>
<h2 id="Синтаксис">Синтаксис</h2>
<pre class="syntaxbox"><em>object</em> instanceof <em>constructor</em></pre>
<h3 id="Параметри">Параметри</h3>
<dl>
<dt><code>object</code></dt>
<dd>Об'єкт, який потрібно перевірити.</dd>
</dl>
<dl>
<dt><code>constructor</code></dt>
<dd>Функція для перевірки.</dd>
</dl>
<h2 id="Опис">Опис</h2>
<p>Оператор <code>instanceof</code> перевіряє присутність <code>constructor.prototype</code> у ланцюжку прототипів об'єкта <code>object</code>.</p>
<pre class="brush: js">// визначення конструкторів
function C() {}
function D() {}
var o = new C();
// true, тому що: Object.getPrototypeOf(o) === C.prototype
o instanceof C;
// false, тому що D.prototype немає у ланцюжку прототипів o
o instanceof D;
o instanceof Object; // true, тому що:
C.prototype instanceof Object // true
C.prototype = {};
var o2 = new C();
o2 instanceof C; // true
// false, тому що C.prototype більше немає у
// ланцюжку прототипів o
o instanceof C;
D.prototype = new C(); // додати C до збірки D [[Prototype]]
var o3 = new D();
o3 instanceof D; // true
o3 instanceof C; // true, оскільки C.prototype тепер є у ланцюжку прототипів o3
</pre>
<p>Зауважте, що значення перевірки <code>instanceof</code> може змінитись на підставі змін у властивості конструкторів <code>prototype</code>, також воно може змінитись через зміну прототипу об'єкта методом <code>Object.setPrototypeOf</code>. Це також можливо зробити використанням нестандартної псевдовластивості <code>__proto__</code>.</p>
<h3 id="instanceof_та_декілька_контекстів_наприклад_фрейми_чи_вікна"><code>instanceof</code> та декілька контекстів (наприклад, фрейми чи вікна)</h3>
<p>Різні області видимості мають різні середовища виконання. Це означає, що вони мають різні вбудовані складові (різні глобальні об'єкти, різні конструктори і т. д.). Це може призвести до неочікуваних результатів. Наприклад, <code>[] instanceof window.frames[0].Array</code> поверне <code>false</code>, тому що <code>Array.prototype !== </code><code>window.frames[0].Array</code>, а масиви успадковуються від першого.</p>
<p>Спочатку це може виглядати дивно, але, коли починаєш мати справу з кількома фреймами або вікнами у скрипті та передавати об'єкти з одного контексту у інший через функції, це є правильним та сильним аспектом. Наприклад, ви можете безпечно перевірити, чи є наданий об'єкт, насправді, масивом, за допомогою <code>Array.isArray(myObj)</code></p>
<p>Наприклад, перевіряючи, чи <a href="/uk/docs/Web/API/Node">Nodes</a> є <a href="/uk/docs/Web/API/SVGElement">SVGElement</a> у іншому контексті, ви можете використати <code>myNode instanceof myNode.ownerDocument.defaultView.SVGElement</code></p>
<div class="note"><strong>Примітка для розробників Mozilla:</strong><br>
У коді, що використовує XPCOM, <code>instanceof</code> має особливий ефект: <code>obj instanceof </code><em><code>xpcomInterface</code></em> (наприклад, <code>Components.interfaces.nsIFile</code>) викликає <code>obj.QueryInterface(<em>xpcomInterface</em>)</code> та повертає <code>true</code>, якщо QueryInterface має успішний результат. Побічним ефектом такого виклику є те, що ви можете використовувати властивості <em><code>xpcomInterface</code></em> на <code>obj</code> після успішної перевірки <code>instanceof</code>. На відміну від стандартних глобальних складових JavaScript, перевірка <code>obj instanceof xpcomInterface</code> працює, як очікується, навіть якщо <code>obj</code> з іншої області видимості.</div>
<h2 id="Приклади">Приклади</h2>
<h3 id="Демострація_того_що_String_та_Date_належать_до_типу_Object_та_виняткові_випадки">Демострація того, що <code>String</code> та <code>Date</code> належать до типу <code>Object</code>, та виняткові випадки</h3>
<p>Наступний код використовує <code>instanceof</code>, щоб продемонструвати, що об'єкти <code>String</code> та <code>Date</code> також належать до типу <code>Object</code> (вони походять від <code>Object</code>).</p>
<p>Однак, об'єкти, створені за допомогою нотації об'єктного літералу, є винятком: Хоча прототип дорівнює undefined, <code>instanceof Object</code> вертає <code>true</code>.</p>
<pre class="brush: js">var simpleStr = 'Це простий рядок';
var myString = new String();
var newStr = new String('Рядок, створений конструктором');
var myDate = new Date();
var myObj = {};
var myNonObj = Object.create(null);
simpleStr instanceof String; // вертає false, перевіряє ланцюжок прототипів, знаходить undefined
myString instanceof String; // вертає true
newStr instanceof String; // вертає true
myString instanceof Object; // вертає true
myObj instanceof Object; // вертає true, не зважаючи на те, що прототип дорівнює undefined
({}) instanceof Object; // вертає true, те саме, що у попередньому випадку
myNonObj instanceof Object; // вертає false, спосіб створення об'єкту, який не є екземпляром Object
myString instanceof Date; // вертає false
myDate instanceof Date; // вертає true
myDate instanceof Object; // вертає true
myDate instanceof String; // вертає false
</pre>
<h3 id="Демонстрація_того_що_mycar_належить_до_типу_Car_та_до_типу_Object">Демонстрація того, що <code>mycar</code> належить до типу <code>Car</code> та до типу <code>Object</code></h3>
<p>Наступний код створює тип об'єктів <code>Car</code> та екземпляр цього типу, <code>mycar</code>. Оператор <code>instanceof</code> демонструє, що об'єкт <code>mycar</code> належить до типу <code>Car</code> та до типу <code>Object</code>.</p>
<pre class="brush: js">function Car(make, model, year) {
this.make = make;
this.model = model;
this.year = year;
}
var mycar = new Car('Honda', 'Accord', 1998);
var a = mycar instanceof Car; // вертає true
var b = mycar instanceof Object; // вертає true
</pre>
<h3 id="Не_instanceof">Не instanceof</h3>
<p>Щоб перевірити, що об'єкт не є екземпляром певного Конструктора, ви можете зробити</p>
<pre class="brush: js">if (!(mycar instanceof Car)) {
// Зробити щось, наприклад, mycar = new Car(mycar)
}
</pre>
<p>Це, насправді, відрізняється від коду</p>
<pre class="brush: js">if (!mycar instanceof Car)</pre>
<p>який завжди дорівнюватиме false (<code>!mycar</code> обчислюється перед <code>instanceof</code>, тому ви завжди перевірятимете, чи є булеве значення екземпляром <code>Car</code>).</p>
<h2 id="Специфікації">Специфікації</h2>
<table class="standard-table">
<tbody>
<tr>
<th scope="col">Специфікація</th>
<th scope="col">Статус</th>
<th scope="col">Коментар</th>
</tr>
<tr>
<td>{{SpecName('ESDraft', '#sec-relational-operators', 'Relational Operators')}}</td>
<td>{{Spec2('ESDraft')}}</td>
<td></td>
</tr>
<tr>
<td>{{SpecName('ES6', '#sec-relational-operators', 'Relational Operators')}}</td>
<td>{{Spec2('ES6')}}</td>
<td></td>
</tr>
<tr>
<td>{{SpecName('ES5.1', '#sec-11.8.6', 'The instanceof operator')}}</td>
<td>{{Spec2('ES5.1')}}</td>
<td></td>
</tr>
<tr>
<td>{{SpecName('ES3', '#sec-11.8.6', 'The instanceof operator')}}</td>
<td>{{Spec2('ES3')}}</td>
<td>Початкове визначення. Реалізоване у JavaScript 1.4.</td>
</tr>
</tbody>
</table>
<h2 id="Сумісність_з_веб-переглядачами">Сумісність з веб-переглядачами</h2>
<p>{{Compat("javascript.operators.instanceof")}}</p>
<h2 id="Див._також">Див. також</h2>
<ul>
<li><code><a href="/uk/docs/Web/JavaScript/Reference/Operators/typeof" title="/en-US/docs/JavaScript/Reference/Operators/typeof">typeof</a></code></li>
<li>{{jsxref("Symbol.hasInstance")}}</li>
<li>{{jsxref("Object.prototype.isPrototypeOf")}}</li>
</ul>
|