Запропонувати правкуПокращити цю статтюДопрацюйте відповідь до «Оператор instanceof?». Ваші зміни проходять модерацію перед публікацією.Потрібне підтвердженняКонтентЩо ви змінюєте🇺🇸EN🇺🇦UAПереглядЗаголовок (UA)Коротка відповідь (UA)**Оператор `instanceof`** у JavaScript використовується для перевірки, чи є об'єкт **екземпляром (instance)** певного **класу або конструктора**, тобто в якому «ланцюжку прототипів» він перебуває. **Ключове:** `instanceof` перевіряє наявність `Constructor.prototype` у ланцюжку прототипів об'єкта і враховує успадкування, але не працює з примітивами - для масивів надійніше використовувати `Array.isArray()`.Показується над повною відповіддю для швидкого нагадування.Відповідь (UA)ЗображенняОператор `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 ```Для рев’юераПримітка для модератора (необов’язково)Бачить лише модератор. Прискорює рев’ю.