instanceof
Оператор instanceof
перевіряє, чи присутня властивість конструктора prototype
десь у ланцюжку прототипів об'єкта.
The source for this interactive example is stored in a GitHub repository. If you'd like to contribute to the interactive examples project, please clone https://github.com/mdn/interactive-examples and send us a pull request.
Синтаксис
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 (en-US) у іншому контексті, ви можете використати 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
).
Однак, об'єкти, створені за допомогою нотації об'єктного літералу, є винятком: Хоча прототип дорівнює 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 (ECMA-262) The definition of 'Relational Operators' in that specification. |
Living Standard | |
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. |
Сумісність з веб-переглядачами
BCD tables only load in the browser