Оператор instanceof позволяет проверить, создан ли объект данным конструктором, с учетом наследования.
Алгоритм работы instanceof
Рассмотрим пример:
function Rabbit() { }
var rabbit = new Rabbit;
*!*
alert(rabbit instanceof Rabbit); // true
*/!*
Оператор instanceof никак не использует свойство constructor. Он опирается исключительно на цепочку __proto__.
Проверка obj instanceof F работает по следующей логике:
- Получить
obj.__proto__ - Сравнить
obj.__proto__сF.prototype - Если не совпадает, тогда заменить
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]].
Комментарии
- Приветствуются комментарии, содержащие дополнения и вопросы по статье, и ответы на них.
- Если ваш комментарий касается задачи -- откройте её в отдельном окне и напишите там.
- Комментарии без смысла, с рекламой или не о статье вообще - удаляются.