Каково различие между isPrototypeOf и instanceof в JavaScript?

В части моего собственного более старого кода я использую следующее:

Object.prototype.instanceOf = function( iface )
{
 return iface.prototype.isPrototypeOf( this );
};

Затем я делаю (например),

[].instanceOf( Array )

Это работает, но кажется, что следующее сделало бы то же:

[] instanceof Array

Теперь, конечно, это - только очень простой пример. Мой вопрос поэтому:

a instanceof b ВСЕГДА то же как b.prototype.isPrototypeOf(a) ?

45
задан Keith Thompson 8 February 2013 в 20:15
поделиться

1 ответ

Да, они делают одно и то же, оба обходят цепочку прототипов, ища в ней конкретный объект.

Разница между ними в том, чем они являются, и как вы их используете, например, isPrototypeOf - это функция, доступная на объекте Object. prototype, она позволяет проверить, находится ли конкретный объект в цепочке прототипов другого, поскольку этот метод определен на Object.prototype, он будет доступен для всех объектов.

instanceof является оператором и ожидает два операнда, объект и конструктор функции, он будет проверять, существует ли свойство переданной функции prototype в цепочке объекта (через [[HasInstance]](V) внутреннюю операцию, доступную только в объектах Function).

For example:

function A () {
  this.a = 1;
}
function B () {
  this.b = 2;
}
B.prototype = new A();
B.prototype.constructor = B;

function C () {
  this.c = 3;
}
C.prototype = new B();
C.prototype.constructor = C;

var c = new C();

// instanceof expects a constructor function

c instanceof A; // true
c instanceof B; // true
c instanceof C; // true

// isPrototypeOf, can be used on any object
A.prototype.isPrototypeOf(c); // true
B.prototype.isPrototypeOf(c); // true
C.prototype.isPrototypeOf(c); // true
28
ответ дан 26 November 2019 в 21:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: