比较instanceof与isPrototypeOf
在javascript中,instanceof 和 isPrototypeOf 都可以判断一个原型是否在另一个实例的原型链中,那他们有什么区别呢,为什么说 isPrototypeOf 可以替代 instanceof 。
instanceof 用法
function Super() {
// init code
}
function Sub() {
Super.call(this);
// other init code
}
Sub.prototype = new Super();
var sub = new Sub();
对于上面的代码,用 instanceof 可以像这样确定他们的关系:
sub instanceof Super; // true
isPrototypeOf 用法
复用上面的代码,用 isPrototypeOf 可以这样写:
Super.prototype.isPrototypeOf(sub); // true
区别
乍一看,都可以用,但某种情况下是有区别的,例如:
var super = {
// some super properties
}
var sub = Object.create(super);
sub.someProp = 5;
var sub = Object.create(sub);
console.log(super.isPrototypeOf(sub)); // true
console.log(sub instanceof super); // TypeError
这时候 super 并不是构造函数,无法使用 instanceof, 只能使用 isPrototypeOf.
结论
结论就是 isPrototypeOf 能使用的场景更广,完全可以替代 instanceof, 只是写起来没那么简洁。