如何判断一个对象是否在另一个对象的原型链上

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

参考下面的例子:

let p = {x: 1};  // 定义一个原型对象
let o = Object.create(p);  // 创建一个新对象o,指定它的原型对象为p
p.isPrototypeOf(o);  // 对象p存在于对象o的原型链上,返回true
Object.prototype.isPrototypeOf(p);  // 对象Object.prototype存在于对象p的原型链上,返回true
Object.prototype.isPrototypeOf(o);  // 对象Object.prototype存在于对象o的原型链上,返回true

注意!isPrototypeOf()方法只能用来确定一个对象是否存在于另一个对象的原型链上,而不能确定一个对象是否是另一个对象的原型。

原因是:即便一个对象在另一个对象的原型链上,它是不是另一个对象的原型还要取决于它们之间的继承关系,只有在直接继承的时候,它才是另一个对象的原型,否则就只是另一个对象原型链中的一环。

拿上面的例子来说:

对象p存在于对象o的原型链上,且对象o从对象p直接继承属性,所以对象p是对象o的原型对象;

对象Object.prototype存在于对象p的原型链上,且对象p从对象Object.prototype直接继承属性,所以对象Object.prototype是对象p的原型对象;

Object.prototype也存在于对象o的原型链上,但对象o从对象Object.prototype间接继承属性,所以Object.prototype不是对象o的原型对象。