用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
的原型对象。
