--- title: instanceof slug: Web/JavaScript/Reference/Operators/instanceof tags: - JavaScript - Object - Об'єкт - Оператор translation_of: Web/JavaScript/Reference/Operators/instanceof ---
Оператор instanceof перевіряє, чи присутня властивість конструктора prototype десь у ланцюжку прототипів об'єкта.
object instanceof constructor
objectconstructorОператор 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
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
Щоб перевірити, що об'єкт не є екземпляром певного Конструктора, ви можете зробити
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")}}
typeof