Добавить в корзинуПозвонить
Найти в Дзене
Retr0

Проверка класса. Instanceof

Оператор instanceof позволяет проверить, к какому классу принадлежит ключ Такая проверка может потребоваться во многих случаях. Здесь мы используем её для создания функции, которая воссоздает аргументы по-разному в зависимости от их типа. Оператор instanceof Синтаксис: Оператор вернёт true, если obj принадлежит классу Class или наследующему от него. Допустим: class Iron {} let iron = new Iron(); //это объект класса Iron? alert( iron instanceof Iron ); Также это работает с функциями: //Вместо класса function Iron() {} alert( new Iron() instanceof Iron ); Обычно оператор instanceof просматривая для проверки цепочки прототипов. Но это обычно изменяется при помощи метода Symbol.hasInstance Алгоритм работы obj instanceof Class: // проверка instanceof будет полагать, // что всё со свойством canEat - животное Animal class Animal { static [Symbol.hasInstance](obj) { if (obj.canEat) return true; } } let obj = { canEat: true }; alert(obj instanceof Animal); // true: вызва
Оглавление

Оператор instanceof позволяет проверить, к какому классу принадлежит ключ

Такая проверка может потребоваться во многих случаях. Здесь мы используем её для создания функции, которая воссоздает аргументы по-разному в зависимости от их типа.

Оператор instanceof

Синтаксис:

  1. obj instanceof Class

Оператор вернёт true, если obj принадлежит классу Class или наследующему от него.

Допустим:

class Iron {}
let iron = new Iron();
//это объект класса Iron?
alert( iron instanceof Iron );

Также это работает с функциями:

//Вместо класса
function Iron() {}
alert( new Iron() instanceof Iron );

Обычно оператор instanceof просматривая для проверки цепочки прототипов. Но это обычно изменяется при помощи метода Symbol.hasInstance

Алгоритм работы obj instanceof Class:

  1. Если имеется статический метод Symbol.hasInstance, тогда вызвать его: Class[Symbol.hasInstance](obj). Он должен вернуть либо true, либо false, и это конец. Это как раз и есть возможность ручной настройки instanceof.
// проверка instanceof будет полагать,
// что всё со свойством canEat - животное Animal
class Animal {
static [Symbol.hasInstance](obj) {
if (obj.canEat) return true;
}
} let obj = { canEat: true };
alert(obj instanceof Animal); // true: вызван Animal[Symbol.hasInstance](obj)

2. Большая часть классов не имеет метода Symbol.hasInstance. В этом
случае используется стандартная логика: проверяется, равен ли Class.prototype одному из прототипов в прототипной цепочке obj.

obj.__proto__ === Class.prototype?
obj.__proto__.__proto__ === Class.prototype?
obj.__proto__.__proto__.__proto__ === Class.prototype?
...
// если какой-то из ответов true - возвратить true
// если дошли до конца цепочки - false

Бонус: Object.prototype.toString возвращает тип

Мы уже знаем, что обычные объекты преобразуется к строке как [object Object]:

let obj = {};
alert(obj); // [object Object]
alert(obj.toString()); // то же самое

Так реализовается метод toString. Но у toString имеются скрытые возможности, которые делают метод гораздо более всевозможным. Мы можем использовать его как расширенную версию typeof и как альтернативу instanceof.

Symbol.toStringTag

Поведение объекта toString можно настраивать, используя специальное свойство объекта Symbol.toStringTag.

Например:

let user = {
[Symbol.toStringTag]: "User"
};
alert( {}.toString.call(user) ); // [object User]

Такое свойство есть у большей части объектов, специфичных для определённых окружений. Вот несколько примеров для браузера:

// toStringTag для браузерного объекта и класса
alert( window[Symbol.toStringTag]); // window
alert( XMLHttpRequest.prototype[Symbol.toStringTag] ); // XMLHttpRequest
alert( {}.toString.call(window) ); // [object Window]
alert( {}.toString.call(new XMLHttpRequest()) ); // [object XMLHttpRequest]

Можно использовать {}.toString.call вместо instanceof для уже имеющих объектов, когда мы хотим получить тип в виде строки, а не просто сделать проверку.

Конец

Всем пока, с вами был еблан спасибо что дочитали до конца.