Instanceof: примеры (JAVASCRIPT)
instanceof(object: any, constructor: function): booleanБазовое описание функции instanceof
Оператор instanceof в JavaScript проверяет, принадлежит ли объект к определённому классу или конструктору. Он возвращает булево значение: true, если объект является экземпляром указанного класса, и false в противном случае.
Основное применение оператора — проверка типа объекта во время выполнения программы, особенно при работе с наследованием и сложными цепочками прототипов.
Аргументы оператора
Оператор принимает два аргумента:
- object — проверяемый объект.
- 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
Расширенные примеры
Проверка с несколькими конструкторами:
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
Использование с встроенными объектами:
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:
class Numeric {
static [Symbol.hasInstance](value) {
return typeof value === 'number';
}
}
console.log(123 instanceof Numeric);
console.log("123" instanceof Numeric);true false
Сложная цепочка прототипов:
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