比较instanceof与isPrototypeOf

比较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, 只是写起来没那么简洁。

0%