В части моего собственного более старого кода я использую следующее:
Object.prototype.instanceOf = function( iface )
{
return iface.prototype.isPrototypeOf( this );
};
Затем я делаю (например),
[].instanceOf( Array )
Это работает, но кажется, что следующее сделало бы то же:
[] instanceof Array
Теперь, конечно, это - только очень простой пример. Мой вопрос поэтому:
a instanceof b
ВСЕГДА то же как b.prototype.isPrototypeOf(a)
?
Да, они делают одно и то же, оба обходят цепочку прототипов, ища в ней конкретный объект.
Разница между ними в том, чем они являются, и как вы их используете, например, 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