Зачем нам вообще нужен isPrototypeOf? - PullRequest
15 голосов
/ 12 мая 2011

эта страница сообщает:

Примечание: isPrototypeOf отличается от оператора instanceof.В объекте-выражении instanceof AFunction цепочка прототипов объектов проверяется по AFunction.prototype, а не по самому AFunction

Хорошо, я не совсем понимаю, что они пытаются нам сказать.Разве object instanceof AFunction не совпадает с `AFunction.prototype.isPrototypeOf (object)?или я не прав?

Зачем нам вообще нужен isPrototypeOf?

Если мне когда-либо понадобится сделать p.isPrototypeOf(o) Разве я не могу просто сделать o instanceof p.constructor?

Дополнительно, p.isPrototypeOf(o) функционально эквивалентно p===Object.getPrototypeOf(o)?

Ответы [ 3 ]

15 голосов
/ 12 мая 2011

Конструкторы объектов - это прикольные вещи. С этот ответ :

Как указал Пойнти, в своем ответить

Свойство "конструктор" является ссылка на функцию, которая создала прототип объекта, а не объект сам по себе.

Обычный способ справиться с этим - увеличить прототип объекта constructor свойство после присвоения к prototype.

Конструктор объекта не доступен только для чтения, поэтому это возможно сделать вообще. Я мог бы присвоить любое значение p.constructor после создания p, и это полностью сломалось бы, используя

o instanceof p.constructor

вместо

p.isPrototypeOf(o)

Дальнейшее чтение


Редактировать re: OP редактировать

Дополнительно, p.isPrototypeOf(o) функционально эквивалентно p===Object.getPrototypeOf(o)?

Это больше похоже на ваш первоначальный вопрос, кроме того факта, что Object.getPrototypeOf не был представлен до JavaScript 1.8.1? См. Джон Резиг - Object.getPrototypeOf. Возможно, более уместно, эти две функции отличаются в спецификации ! (предупреждение, PDF ссылка)

15.2.3.2 Object.getPrototypeOf

15.2.4.6 Object.prototype.isPrototypeOf

7 голосов
/ 12 мая 2011

Я думаю, что самое важное различие заключается в том, что метод 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 не очень поможет.

1 голос
/ 12 мая 2011

instanceOf -> Этот объект (или объекты, из которых он был получен) использовал именованный объект в качестве прототипа

isPrototypeOf -> Этот объект использовался именованным объектом (или объектами, из которых он был получен)from) в качестве прототипа.

т.е..

instanceOf запрашивает предков объектов.

IsPrototypeOf запрашивает потомков объектов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...