Instanceof: примеры (JAVASCRIPT)

Использование instanceof в JavaScript на практике
Раздел: Языковые конструкции, Операторы
instanceof(object: any, constructor: function): boolean

Базовое описание функции instanceof

Оператор instanceof в JavaScript проверяет, принадлежит ли объект к определённому классу или конструктору. Он возвращает булево значение: true, если объект является экземпляром указанного класса, и false в противном случае.

Основное применение оператора — проверка типа объекта во время выполнения программы, особенно при работе с наследованием и сложными цепочками прототипов.

Аргументы оператора

Оператор принимает два аргумента:

  1. object — проверяемый объект.
  2. constructor — функция-конструктор или класс, на соответствие которому проверяется объект.

Возвращаемое значение

Возвращается логическое значение. Если объект является экземпляром конструктора (включая проверку по цепочке прототипов), возвращается true. Если объект не является объектом или конструктор не является функцией, может быть возвращено false или выброшено исключение TypeError.

Основные примеры использования

Пример проверки с базовыми конструкторами:

console.log([] instanceof Array);
console.log({} instanceof Object);
console.log("text" instanceof String);
console.log(new Date() instanceof Date);
true
true
false
true

Пример с наследованием классов:

class Animal {}
class Dog extends Animal {}
const myDog = new Dog();
console.log(myDog instanceof Dog);
console.log(myDog instanceof Animal);
console.log(myDog instanceof Object);
true
true
true

Пример с конструктором функции:

function Car(brand) {
  this.brand = brand;
}
const myCar = new Car("Toyota");
console.log(myCar instanceof Car);
console.log(myCar instanceof Object);
true
true

Альтернативные методы в JavaScript

typeof — определяет примитивный тип данных, но для объектов и массивов возвращает "object".

Array.isArray() — точно определяет, является ли объект массивом.

Object.prototype.toString.call() — возвращает строку с типом объекта, полезен для встроенных типов.

constructor свойство — содержит ссылку на конструктор объекта, но может быть изменено.

Оператор instanceof предпочтителен при проверке цепочек прототипов, особенно в иерархиях классов. Для примитивов лучше использовать typeof, а для точной проверки массивов — Array.isArray().

Аналоги в других языках

В PHP используется оператор instanceof с похожим синтаксисом:

class MyClass {}
$obj = new MyClass();
var_dump($obj instanceof MyClass);
bool(true)

В Python применяется функция isinstance():

class MyClass:
    pass
obj = MyClass()
print(isinstance(obj, MyClass))
True

В Java также используется оператор instanceof:

Object str = "test";
System.out.println(str instanceof String);
true

В C# применяется оператор is:

object obj = "string";
Console.WriteLine(obj is string);
True

Типичные ошибки

Проверка примитивов всегда возвращает false:

console.log("строка" instanceof String);
console.log(42 instanceof Number);
false
false

Использование не функции в качестве правого операнда вызывает ошибку:

try {
  console.log({} instanceof null);
} catch (e) {
  console.error(e.toString());
}
TypeError: Right-hand side of 'instanceof' is not an object

Проблемы с фреймами браузера — конструкторы из разных фреймов считаются разными:

// В консоли браузера с открытым iframe
const iframe = document.createElement('iframe');
document.body.appendChild(iframe);
const iframeArray = iframe.contentWindow.Array;
const arr = new iframeArray();
console.log(arr instanceof Array);
console.log(arr instanceof iframeArray);
false
true

Изменения в новых версиях

В ES2015 (ES6) добавлена поддержка Symbol.hasInstance, позволяющая кастомизировать поведение instanceof для классов.

Пример использования Symbol.hasInstance:

class MyClass {
  static [Symbol.hasInstance](instance) {
    return Array.isArray(instance);
  }
}
console.log([] instanceof MyClass);
console.log({} instanceof MyClass);
true
false

Расширенные примеры

Проверка с несколькими конструкторами:

Пример javascript
function A() {}
function B() {}
const obj = new A();
console.log(obj instanceof A);
console.log(obj instanceof B);
B.prototype = Object.create(A.prototype);
const obj2 = new B();
console.log(obj2 instanceof A);
console.log(obj2 instanceof B);
true
false
true
true

Использование с встроенными объектами:

Пример javascript
console.log(/regex/ instanceof RegExp);
console.log(new Map() instanceof Map);
console.log(new Set() instanceof Set);
console.log(Promise.resolve() instanceof Promise);
true
true
true
true

Кастомная проверка с Symbol.hasInstance:

Пример javascript
class Numeric {
  static [Symbol.hasInstance](value) {
    return typeof value === 'number';
  }
}
console.log(123 instanceof Numeric);
console.log("123" instanceof Numeric);
true
false

Сложная цепочка прототипов:

Пример javascript
function Base() {}
function Derived() {}
Derived.prototype = Object.create(Base.prototype);
const d = new Derived();
console.log(d instanceof Derived);
console.log(d instanceof Base);
console.log(d instanceof Object);
console.log(Derived.prototype instanceof Base);
true
true
true
true

JS instanceof function comments

En
Instanceof Tests whether an object has in its prototype chain the prototype property of a constructor.