HTML: Markup language
CSS: Styling language
JavaScript: Scripting language
Web APIs: Programming interfaces
All web technology
Learn web development
Discover our tools
Get to know MDN better
This page was translated from English by the community. Learn more and join the MDN Web Docs community.
View in English Always switch to English
This feature is well established and works across many devices and browser versions. It’s been available across browsers since июль 2015 г..
Оператор instanceof проверяет, принадлежит ли объект к определённому классу. Другими словами, object instanceof constructor проверяет, присутствует ли объект constructor.prototype в цепочке прототипов object.
instanceof
object instanceof constructor
constructor.prototype
object
function Car(make, model, year) { this.make = make; this.model = model; this.year = year; } const auto = new Car("Honda", "Accord", 1998); console.log(auto instanceof Car); // Expected output: true console.log(auto instanceof Object); // Expected output: true
Проверяемый объект.
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__.
Object.setPrototypeOf
__proto__
Различные контексты имеют разные среды выполнения. Это означает, что они имеют различные built-ins (разный глобальный объект, различные конструкторы и т.д.). Это может давать неожиданные результаты. Например, [] instanceof window.frames[0].Array вернёт false, потому что Array.prototype !== window.frames[0].Array а массив наследуется от Array.
[] instanceof window.frames[0].Array
false
Array.prototype !== window.frames[0].Array
Array
Это может казаться несущественной проблемой сначала, но при работе с несколькими фреймами или окнами, и передачи объектов из одного контекста в другой с помощью функций, это может стать серьёзной проблемой. С другой стороны, безопасно проверить, является ли некоторый объект массивом можно используя Array.isArray(myObj).
Array.isArray(myObj)
Например, для проверки того, что Node является SVGElement в разных контекстах можно использовать myNode instanceof myNode.ownerDocument.defaultView.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 относится к другому контексту.
obj instanceof xpcomInterface
Components.interfaces.nsIFile
obj.QueryInterface(xpcomInterface)
true
xpcomInterface
obj
String
Date
Object
Следующий код использует instanceof, чтобы показать что объекты String и Date также имеют тип Object (они являются наследниками Object).
Однако, объекты, созданные с помощью литералов, являются исключениями — хотя их prototype равен undefined, выражение instanceof Object возвращает true.
undefined
instanceof Object
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
Следующий код создаёт тип 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
Enable JavaScript to view this browser compatibility table.
typeof
Symbol.hasInstance