Ste*_*eil 45 javascript inheritance prototype instanceof
在我自己的一些旧代码中,我使用以下代码:
Object.prototype.instanceOf = function( iface )
{
return iface.prototype.isPrototypeOf( this );
};
Run Code Online (Sandbox Code Playgroud)
然后我做(例如)
[].instanceOf( Array )
Run Code Online (Sandbox Code Playgroud)
这有效,但似乎以下情况也是如此:
[] instanceof Array
Run Code Online (Sandbox Code Playgroud)
现在,这肯定只是一个非常简单的例子.因此,我的问题是:
是否a instanceof b 总是一样的b.prototype.isPrototypeOf(a)?
CMS*_*CMS 28
是的,他们做同样的事情,都遍历原型链,寻找其中的特定对象.
这两个之间的区别是它们是什么,以及如何使用它们,例如isPrototypeOf是功能上可用的Object.prototype对象,它可以让你测试,如果一个特定的对象是另一个原型链,因为这种方法被定义Object.prototype,它是适用于所有对象.
instanceof是一个运算符,它需要两个操作数,一个对象和一个构造函数,它将测试prototype对象链上是否存在传递的函数属性(通过[[HasInstance]](V)内部操作,仅在Function对象中可用).
例如:
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
Run Code Online (Sandbox Code Playgroud)
总是
a instanceof b与 相同吗b.prototype.isPrototypeOf(a)?
不,a instanceof b不会总是表现得与 一样b.prototype.isPrototypeOf(a)。
CMS 的回答指出,它们的不同之处在于(一个是运算符,另一个是对象上可用的内置方法Object.prototype)。这是正确的,但是也有一些特殊情况,这a instanceof b会导致一段TypeError时间b.prototype.isPrototypeOf(a)可以正常工作,反之亦然。
的右侧instanceof预计是构造函数。
如果b不是函数:
a instanceof b将导致TypeError.
b.prototype.isPrototypeOf(a)会工作得很好。
const b = {
prototype: {}
};
const a = Object.create( b.prototype );
console.log( b.prototype.isPrototypeOf(a) ); // true
console.log( a instanceof b ); // TypeError: Right-hand side of 'instanceof' is not callableRun Code Online (Sandbox Code Playgroud)
使用时b.prototype.isPrototypeOf(a),b.prototype应继承自Object.prototype:
如果b.prototype无法访问该Object.prototype.isPrototypeOf()方法:
b.prototype.isPrototypeOf(a)将导致TypeError.a instanceof b会工作得很好。function B() {};
B.prototype = Object.create( null );
const a = new B();
console.log( a instanceof B ); // true
console.log( B.prototype.isPrototypeOf(a) ) // TypeError: B.prototype.isPrototypeOf is not a functionRun Code Online (Sandbox Code Playgroud)
如果 的右侧instanceof是绑定函数,则将其视为与其目标函数等效。
如果 b 是绑定函数:
a instanceof b会工作得很好。b.prototype.isPrototypeOf(a)将导致TypeError(绑定函数没有属性prototype)。function B() {};
const BoundB = B.bind( null );
const a = new B();
console.log( a instanceof BoundB ); // true
console.log( BoundB.prototype.isPrototypeOf(a) ) // TypeError: Cannot read property 'isPrototypeOf' of undefinedRun Code Online (Sandbox Code Playgroud)
Object.create(),而不使用构造函数,那么您可能应该使用该Object.prototype.isPrototypeOf()方法(实际上, 的用例instanceof受到更多限制,因为instanceof期望其右侧参数是构造函数)。instanceof运算符会稍微安全一些(您将能够覆盖绑定函数以及Object.prototype不在 原型链中的情况Constructor.prototype)。