Подтвердить что ты не робот

Зачем нам нужен 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)?

4b9b3361

Ответ 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 запрашивает потомки объектов.