Мастер-классы по Javascript Екатеринбург Ростов-на-Дону Москва Узнать больше...
Содержание (скрыть) Содержание (показать)

Оператор "instanceof"

  1. Алгоритм работы instanceof
  2. Когда instanceof не работает?
  3. Итого

Оператор instanceof позволяет проверить, создан ли объект данным конструктором, с учетом наследования.

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

Рассмотрим пример:

function Rabbit() { }
var rabbit = new Rabbit;

*!*
alert(rabbit instanceof Rabbit); // true
*/!*

Оператор instanceof никак не использует свойство constructor. Он опирается исключительно на цепочку __proto__.

Проверка obj instanceof F работает по следующей логике:

  1. Получить obj.__proto__
  2. Сравнить obj.__proto__ с F.prototype
  3. Если не совпадает, тогда заменить obj на obj.__proto__ и повторить проверку на шаге два до тех пор, пока либо не найдется совпадение (результат true), либо цепочка не закончится (результат false).

В примере выше, совпадение найдено на первом же шаге, так как: rabbit.__proto__ == Rabbit.prototype.

Боле глубокий пример:

function Rabbit() { };
var rabbit = new Rabbit;

alert(rabbit instanceof Object); // true

Здесь совпадение найдено для rabbit.__proto__.__proto__ == Object.prototype.

Заметим, что совпадение использует только цепочку __proto__ для объекта и prototype для функции. Сам объект и сама функция не участвуют в процессе.

Когда instanceof не работает?

Оператор instanceof не срабатывает, когда значение приходит из другого окна или фрейма.

Нпример, массив, который создан и ифрейме и передан в родителя — является instanceof Array в том ифрейме, но не в родительском окне. У каждого окна и фрейма — своя иерархия объектов и свой window .

Как правило, эта проблема возникает со встроенными объектами, в этом случае используется проверка внутреннего свойства [[Class]]. Более подробно это описано в главе Типы данных: получение и проверка.

Итого

  • Оператор obj instanceof Func проверяет тот факт, что obj является результатом вызова new Func. Он учитывает цепочку __proto__, поэтому наследование поддерживается.

    К примеру, массив является и объектом:

    var arr = [];
    alert(arr instanceof Array); // true
    alert(arr instanceof Object); // true
    

  • Оператор instanceof не сможет проверить тип значения, если объект создан в одном окне/фрейме, а проверяется в другом. Это потому, что в каждом окне — своя иерархия объектов. Поэтому для проверки встроенных объектов используют свойство [[Class]].

Комментарии

  1. Приветствуются комментарии, содержащие дополнения и вопросы по статье, и ответы на них.
  2. Если ваш комментарий касается задачи -- откройте её в отдельном окне и напишите там.
  3. Комментарии без смысла, с рекламой или не о статье вообще - удаляются.
Наверх

Содержание

Реклама

Нашли опечатку?

Нашли опечатку на сайте? Что-то кажется странным?
Выделите соответствующий текст и нажмите Ctrl+Enter!

Последние Комментарии

Помоги другим!

Помоги другим узнать о хорошей статье!