Оператор 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
.
Использование 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. |
Поддержка браузерами
Возможность | Chrome | Edge | Firefox | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|---|
Базовая поддержка | Да | Да | 1 | Да | Да | Да |
Возможность | Android webview | Chrome for Android | Edge mobile | Firefox for Android | Opera Android | iOS Safari | Samsung Internet |
---|---|---|---|---|---|---|---|
Базовая поддержка | Да | Да | Да | 4 | Да | Да | Да |