instanceof和isPrototypeOf()的区别

isPrototypeOf()方法用于测试一个对象是否存在于另一个对象的原型链上。

例如Object.prototype.isPrototypeOf({})这条语句用于测试Object.prototype指向的对象是否在对象{}的原型链上。

这条语句的返回值是true,因为用字面量创建的对象等同于用构造函数Object创建的对象实例,默认的原型对象都是Object.prototype,存在于对象实例的原型链上。

instanceof操作符用于测试一个构造函数的prototype属性(指向该构造函数实例的原型对象)是否存在于另一个对象的原型链上。

例如({}) instanceof Object这条语句用于测试构造函数Objectprototype属性指向的对象是否存在于空对象{}的原型链上。

可以看出:isPrototypeOf()方法的左右侧都是对象,而instanceof操作符的右侧必须是一个函数,因为函数才有prototype属性。

两者的功能类似,可以简单总结如下:

A.isPrototypeOf(B)判断的是A对象是否存在于B对象的原型链之中。

A instanceof B判断的是构造函数BB.prototype是否存在与A的原型链之中。

推荐使用isPrototypeOf()方法,因为它能解决所有问题,不管要测试的是对象还是构造函数(测试构造函数时无非是多加个.prototype)。