Skip to main content

Оператор instanceof?

Оператор instanceof у JavaScript використовується для перевірки, чи є об'єкт екземпляром (instance) певного класу або конструктора.

Тобто - він перевіряє, у якому «ланцюжку прототипів» перебуває об'єкт.


Синтаксис

javascript
object instanceof Constructor
  • object - об'єкт, який потрібно перевірити.
  • Constructor - функція-конструктор або клас.

Повертає: true або false


Простий приклад

javascript
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

Ілюстрація:

javascript
function Animal() {} const dog = new Animal(); // Перевірка: console.log(dog instanceof Animal); // true // Під капотом: console.log(Object.getPrototypeOf(dog) === Animal.prototype); // true

Приклад з успадкуванням

javascript
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


Приклад зі звичайними функціями-конструкторами

javascript
function Car() {} function Bike() {} const tesla = new Car(); console.log(tesla instanceof Car); // true console.log(tesla instanceof Bike); // false

Приклад з масивами

javascript
const arr = [1, 2, 3]; console.log(arr instanceof Array); // true console.log(arr instanceof Object); // true

Усі масиви - це об'єкти, тому arr instanceof Object теж true.


Важливо: instanceof не працює з примітивами

javascript
console.log(123 instanceof Number); // false console.log('hello' instanceof String); // false

Тому що 123 і 'hello' - примітиви, а не об'єкти. (Але new Number(123) буде об'єктом.)


Приклад з обгортковими об'єктами

javascript
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.

Приклад:

javascript
iframe.contentWindow.Array !== window.Array

Тому instanceof може повернути false, навіть якщо це дійсно масив.

У таких випадках краще використовувати:

javascript
Array.isArray(value);

Коротко

ПеревіряєЧи перебуває об'єкт у ланцюжку прототипів конструктора
Повертаєtrue / false
Працює зОб'єктами (не з примітивами)
Перевіряє заConstructor.prototype
Враховує успадкуванняТак
Підходить для масивів, класів, функційТак

Приклад для закріплення

javascript
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

Коротка відповідь

Для співбесіди
Premium

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.