From 218934fa2ed1c702a6d3923d2aa2cc6b43c48684 Mon Sep 17 00:00:00 2001 From: Peter Bengtsson Date: Tue, 8 Dec 2020 14:43:23 -0500 Subject: initial commit --- .../reference/operators/instanceof/index.html | 186 +++++++++++++++++++++ 1 file changed, 186 insertions(+) create mode 100644 files/uk/web/javascript/reference/operators/instanceof/index.html (limited to 'files/uk/web/javascript/reference/operators/instanceof') diff --git a/files/uk/web/javascript/reference/operators/instanceof/index.html b/files/uk/web/javascript/reference/operators/instanceof/index.html new file mode 100644 index 0000000000..eca9cdabeb --- /dev/null +++ b/files/uk/web/javascript/reference/operators/instanceof/index.html @@ -0,0 +1,186 @@ +--- +title: instanceof +slug: Web/JavaScript/Reference/Operators/instanceof +tags: + - JavaScript + - Object + - Об'єкт + - Оператор +translation_of: Web/JavaScript/Reference/Operators/instanceof +--- +
{{jsSidebar("Operators")}}
+ +

Оператор instanceof перевіряє, чи присутня властивість конструктора prototype десь у ланцюжку прототипів об'єкта.

+ +
{{EmbedInteractiveExample("pages/js/expressions-instanceof.html")}}
+ + + +

Синтаксис

+ +
object instanceof constructor
+ +

Параметри

+ +
+
object
+
Об'єкт, який потрібно перевірити.
+
+ +
+
constructor
+
Функція для перевірки.
+
+ +

Опис

+ +

Оператор instanceof перевіряє присутність constructor.prototype у ланцюжку прототипів об'єкта object.

+ +
// визначення конструкторів
+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
+
+ +

Зауважте, що значення перевірки instanceof може змінитись на підставі змін у властивості конструкторів prototype, також воно може змінитись через зміну прототипу об'єкта методом Object.setPrototypeOf. Це також можливо зробити використанням нестандартної псевдовластивості __proto__.

+ +

instanceof та декілька контекстів (наприклад, фрейми чи вікна)

+ +

Різні області видимості мають різні середовища виконання. Це означає, що вони мають різні вбудовані складові (різні глобальні об'єкти, різні конструктори і т. д.). Це може призвести до неочікуваних результатів. Наприклад, [] instanceof window.frames[0].Array поверне false, тому що Array.prototype !== window.frames[0].Array, а масиви успадковуються від першого.

+ +

Спочатку це може виглядати дивно, але, коли починаєш мати справу з кількома фреймами або вікнами у скрипті та передавати об'єкти з одного контексту у інший через функції, це є правильним та сильним аспектом. Наприклад, ви можете безпечно перевірити, чи є наданий об'єкт, насправді, масивом, за допомогою Array.isArray(myObj)

+ +

Наприклад, перевіряючи, чи Nodes є SVGElement у іншому контексті, ви можете використати myNode instanceof myNode.ownerDocument.defaultView.SVGElement

+ +
Примітка для розробників Mozilla:
+У коді, що використовує XPCOM, instanceof має особливий ефект: obj instanceof xpcomInterface (наприклад, Components.interfaces.nsIFile) викликає obj.QueryInterface(xpcomInterface) та повертає true, якщо QueryInterface має успішний результат. Побічним ефектом такого виклику є те, що ви можете використовувати властивості xpcomInterface на obj після успішної перевірки instanceof. На відміну від стандартних глобальних складових JavaScript, перевірка obj instanceof xpcomInterface працює, як очікується, навіть якщо obj з іншої області видимості.
+ +

Приклади

+ +

Демострація того, що String та Date належать до типу Object, та виняткові випадки

+ +

Наступний код використовує instanceof, щоб продемонструвати, що об'єкти String та Date також належать до типу Object (вони походять від Object).

+ +

Однак, об'єкти, створені за допомогою нотації об'єктного літералу, є винятком: Хоча прототип дорівнює undefined, instanceof Object вертає true.

+ +
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
+
+ +

Демонстрація того, що mycar належить до типу Car та до типу Object

+ +

Наступний код створює тип об'єктів Car та екземпляр цього типу, mycar. Оператор instanceof демонструє, що об'єкт mycar належить до типу Car та до типу Object.

+ +
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
+
+ +

Не instanceof

+ +

Щоб перевірити, що об'єкт не є екземпляром певного Конструктора, ви можете зробити

+ +
if (!(mycar instanceof Car)) {
+  // Зробити щось, наприклад, mycar = new Car(mycar)
+}
+
+ +

Це, насправді, відрізняється від коду

+ +
if (!mycar instanceof Car)
+ +

який завжди дорівнюватиме false (!mycar обчислюється перед instanceof, тому ви завжди перевірятимете, чи є булеве значення екземпляром Car).

+ +

Специфікації

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
СпецифікаціяСтатусКоментар
{{SpecName('ESDraft', '#sec-relational-operators', 'Relational Operators')}}{{Spec2('ESDraft')}}
{{SpecName('ES6', '#sec-relational-operators', 'Relational Operators')}}{{Spec2('ES6')}}
{{SpecName('ES5.1', '#sec-11.8.6', 'The instanceof operator')}}{{Spec2('ES5.1')}}
{{SpecName('ES3', '#sec-11.8.6', 'The instanceof operator')}}{{Spec2('ES3')}}Початкове визначення. Реалізоване у JavaScript 1.4.
+ +

Сумісність з веб-переглядачами

+ + + +

{{Compat("javascript.operators.instanceof")}}

+ +

Див. також

+ + -- cgit v1.2.3-54-g00ecf