Зачем нам нужен isPrototypeOf?
эта страница гласит:
Примечание: isPrototypeOf отличается от instanceof оператора. В выражении объект instanceof AFunction, проверяется цепь прототипа объекта против AFunction.prototype, а не против самого AFunction
Хорошо, я не понимаю, что они пытаются нам сказать. Является ли object instanceof AFunction
точно таким же, как `AFunction.prototype.isPrototypeOf(object)? или я не прав?
Зачем нам нужен isPrototypeOf
вообще?
Если мне когда-нибудь понадобится p.isPrototypeOf(o)
, я не могу просто сделать o instanceof p.constructor
?
Addtionally, p.isPrototypeOf(o)
функционально эквивалентен p===Object.getPrototypeOf(o)
?
Ответы
Ответ 1
Конструкторы объектов - это смешные вещи. Из этого ответа:
Как указал Уокей, в своем ответить
Свойство "конструктор" является ссылка на созданную функцию прототип объекта, а не объект сам по себе.
Обычный способ справиться с этим - это увеличить прототип объекта constructor
свойство после присвоения к prototype
.
Конструктор объекта не доступен только для чтения, поэтому это можно сделать вообще. Я мог бы назначить любое значение p.constructor
после создания p
, и это будет полностью нарушено с помощью
o instanceof p.constructor
вместо
p.isPrototypeOf(o)
Дальнейшее чтение
Изменить re: Редактирование OP
Addtionally, p.isPrototypeOf(o)
функционально эквивалентен p===Object.getPrototypeOf(o)
?
Это больше похоже на ваш исходный вопрос, кроме того, что Object.getPrototypeOf
не был введен до JavaScript 1.8.1? См. John Resig - Object.getPrototypeOf
. Возможно, более уместно, две функции различаются в спецификация! (предупреждение, ссылка в формате PDF)
![15.2.3.2 Object.getPrototypeOf]()
![15.2.4.6 Object.prototype.isPrototypeOf]()
Ответ 2
Я думаю, что самое важное отличие здесь заключается в том, что метод isPrototypeOf позволяет проверить, наследует ли объект непосредственно от другого объекта. Рассмотрим следующее:
var t = new Object();
var f = new Object();
var c = Object.create(t);
c instanceof f.constructor; // true
c instanceof t.constructor; // true
f.isPrototypeOf(c); // false
t.isPrototypeOf(c); // true
Как вы видите, конструктор - это только функция, которая создавала экземпляр объекта. Не спецификатор реализации. Поэтому, если t.y = function(){ return true; }
и f.y = function(){ return false; }
, и мне нужно было проверить, что c
вернет соответствующую реализацию через цепочку прототипов, instanceof
не очень поможет.
Ответ 3
instanceOf → Этот объект (или объекты, из которого он был получен) использовал именованный объект в качестве прототипа
isPrototypeOf → Этот объект был использован именованным объектом (или объектами, из которого он был получен) в качестве прототипа.
т.
instanceOf запрашивает предков объектов.
IsPrototypeOf запрашивает потомки объектов.