--- title: instanceof slug: Web/JavaScript/Reference/Operators/instanceof tags: - JavaScript - Object - Об'єкт - Оператор translation_of: Web/JavaScript/Reference/Operators/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
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
Щоб перевірити, що об'єкт не є екземпляром певного Конструктора, ви можете зробити
if (!(mycar instanceof Car)) { // Зробити щось, наприклад, mycar = new Car(mycar) }
Це, насправді, відрізняється від коду
if (!mycar instanceof Car)
який завжди дорівнюватиме false (!mycar
обчислюється перед instanceof
, тому ви завжди перевірятимете, чи є булеве значення екземпляром Car
).
Специфікація | Статус | Коментар |
---|---|---|
{{SpecName('ESDraft', '#sec-relational-operators', 'Relational Operators')}} | {{Spec2('ESDraft')}} | |
{{SpecName('ES6', '#sec-relational-operators', 'Relational Operators')}} | {{Spec2('ES6')}} | |
{{SpecName('ES5.1', '#sec-11.8.6', 'The instanceof operator')}} | {{Spec2('ES5.1')}} | |
{{SpecName('ES3', '#sec-11.8.6', 'The instanceof operator')}} | {{Spec2('ES3')}} | Початкове визначення. Реалізоване у JavaScript 1.4. |
{{Compat("javascript.operators.instanceof")}}
typeof