instanceof

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

Синтаксис

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).

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

Специфікація Статус Коментар
ECMAScript Latest Draft (ECMA-262)
The definition of 'Relational Operators' in that specification.
Draft
ECMAScript 2015 (6th Edition, ECMA-262)
The definition of 'Relational Operators' in that specification.
Standard
ECMAScript 5.1 (ECMA-262)
The definition of 'The instanceof operator' in that specification.
Standard
ECMAScript 3rd Edition (ECMA-262)
The definition of 'The instanceof operator' in that specification.
Standard Початкове визначення. Реалізоване у JavaScript 1.4.

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

Update compatibility data on GitHub
DesktopMobileServer
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewChrome for AndroidFirefox for AndroidOpera for AndroidSafari on iOSSamsung InternetNode.js
instanceofChrome Full support 1Edge Full support 12Firefox Full support 1IE Full support 5Opera Full support YesSafari Full support YesWebView Android Full support 1Chrome Android Full support 18Firefox Android Full support 4Opera Android Full support YesSafari iOS Full support YesSamsung Internet Android Full support 1.0nodejs Full support Yes

Legend

Full support  
Full support

Див. також