Оператор instanceof проверяет, принадлежит ли объект к определённому классу. Другими словами, object instanceof constructor проверяет, присутствует ли объект constructor.prototype в цепочке прототипов object.

Синтаксис

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(); // add C to [[Prototype]] linkage of D
var o3 = new D();
o3 instanceof D; // true
o3 instanceof C; // true так как C.prototype теперь присутствует в цепочке прототипов o3

Обратите внимание: результат оператора instanceof зависит от свойства constructor.prototype, поэтому результат оператора может поменяться после изменения этого свойства. Также результат может поменяться после изменения прототипа object (или цепочки прототипов) с помощью Object.setPrototypeOf или нестандартного свойства __proto__.

instanceof и множественные контексты (например, фреймы или окна)

Различные контексты имеют разные среды выполнения. Это означает, что они имеют различныые built-ins (разный глобальный объект, различные конструкторы и т.д.). Это может давать неожиданные результаты. Например, [] instanceof window.frames[0].Array вернёт false, потому что Array.prototype !== window.frames[0].Array а массив наследуется от Array.

Это может казаться несущественной проблемой сначала, но при работе с несколькими фреймами или окнами, и передачи объектов из одного контекста в другой с помощью функций, это может стать серьёзной проблемой. С другой стороны, безопасно проверить, является ли некоторый объект массивом можно используя Array.isArray(myObj).

Например, для проверки того, что Node является 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).

Однако, объекты, созданные с помощью литералов, являются исключениями — хотя их prototype равен undefined, выражение instanceof Object возвращает true.

var simpleStr = 'Это обычная строка'; 
var myString  = new String();
var newStr    = new String('Строка, созданная с помощью конструктора');
var myDate    = new Date();
var myObj     = {};

simpleStr instanceof String; // возвращает false, проверяет цепочку прототипов
myString  instanceof String; // возвращает true
newStr    instanceof String; // возвращает true
myString  instanceof Object; // возвращает true

myObj instanceof Object;    // возвращает true, несмотря на прототип, равный undefined
({})  instanceof Object;    // возвращает true, аналогично предыдущей строчке

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

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

Спецификация Статус Комментарий
ECMAScript Latest Draft (ECMA-262)
Определение 'Relational Operators' в этой спецификации.
Черновик  
ECMAScript 2015 (6th Edition, ECMA-262)
Определение 'Relational Operators' в этой спецификации.
Стандарт  
ECMAScript 5.1 (ECMA-262)
Определение 'The instanceof operator' в этой спецификации.
Стандарт  
ECMAScript 3rd Edition (ECMA-262)
Определение 'The instanceof operator' в этой спецификации.
Стандарт Изначальное определение. Реализована в JavaScript 1.4.

Поддержка браузерами

ВозможностьChromeEdgeFirefoxInternet ExplorerOperaSafari
Базовая поддержка Да Да1 Да Да Да
ВозможностьAndroid webviewChrome for AndroidEdge mobileFirefox for AndroidOpera AndroidiOS SafariSamsung Internet
Базовая поддержка Да Да Да4 Да Да Да

См. также

Метки документа и участники

 Внесли вклад в эту страницу: dima74, vitaliylag, lenkasoft, c01nd01r, spmpl
 Обновлялась последний раз: dima74,