Оператор instanceof?
Оператор instanceof у JavaScript використовується для перевірки,
чи є об'єкт екземпляром (instance) певного класу або конструктора.
Тобто - він перевіряє, у якому «ланцюжку прототипів» перебуває об'єкт.
Синтаксис
object instanceof Constructorobject- об'єкт, який потрібно перевірити.Constructor- функція-конструктор або клас.
Повертає:
trueабоfalse
Простий приклад
class User {}
const user = new User();
console.log(user instanceof User); // true
console.log(user instanceof Object); // true (усі об'єкти успадковуються від Object)
user- екземплярUserА такожuser- екземплярObject, тому щоUserуспадковуєObject
Як це працює під капотом
instanceof перевіряє ланцюжок прототипів:
- бере
object.__proto__ - порівнює його з
Constructor.prototype - якщо не збігається, піднімається вгору по ланцюжку прототипів (
object.__proto__.__proto__і т.д.) - якщо зрештою збіг знайдено →
true, інакше →false
Ілюстрація:
function Animal() {}
const dog = new Animal();
// Перевірка:
console.log(dog instanceof Animal); // true
// Під капотом:
console.log(Object.getPrototypeOf(dog) === Animal.prototype); // trueПриклад з успадкуванням
class Animal {}
class Dog extends Animal {}
const rex = new Dog();
console.log(rex instanceof Dog); // true
console.log(rex instanceof Animal); // true
console.log(rex instanceof Object); // true
console.log(rex instanceof Array); // false
instanceof«піднімається» по всьому ланцюжку успадкування:Dog → Animal → Object
Приклад зі звичайними функціями-конструкторами
function Car() {}
function Bike() {}
const tesla = new Car();
console.log(tesla instanceof Car); // true
console.log(tesla instanceof Bike); // falseПриклад з масивами
const arr = [1, 2, 3];
console.log(arr instanceof Array); // true
console.log(arr instanceof Object); // trueУсі масиви - це об'єкти, тому
arr instanceof Objectтежtrue.
Важливо: instanceof не працює з примітивами
console.log(123 instanceof Number); // false
console.log('hello' instanceof String); // falseТому що
123і'hello'- примітиви, а не об'єкти. (Алеnew Number(123)буде об'єктом.)
Приклад з обгортковими об'єктами
const n = new Number(123);
console.log(n instanceof Number); // true
const s = new String('hi');
console.log(s instanceof String); // trueАле в реальному коді обгортки (
new Number,new String) майже не використовуються, краще використовувати примітиви.
Користувацькі перевірки
Іноді instanceof не спрацює, якщо об'єкт прийшов з іншого контексту (iframe, window),
тому що в нього свій прототип Array.
Приклад:
iframe.contentWindow.Array !== window.ArrayТому
instanceofможе повернутиfalse, навіть якщо це дійсно масив.
У таких випадках краще використовувати:
Array.isArray(value);Коротко
| Перевіряє | Чи перебуває об'єкт у ланцюжку прототипів конструктора |
|---|---|
| Повертає | true / false |
| Працює з | Об'єктами (не з примітивами) |
| Перевіряє за | Constructor.prototype |
| Враховує успадкування | Так |
| Підходить для масивів, класів, функцій | Так |
Приклад для закріплення
class Person {}
class Developer extends Person {}
const tim = new Developer();
console.log(tim instanceof Developer); // true
console.log(tim instanceof Person); // true
console.log(tim instanceof Object); // true
console.log(tim instanceof Array); // falseКоротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.