为什么Foo.prototype.isPrototypeOf(Foo)返回false?

时间:2016-12-23 13:09:18

标签: javascript

我试图在chrome控制台中执行以下行。

function Foo() {}
console.log(Foo.prototype.isPrototypeOf(Foo)); // false
console.log(Object.prototype.isPrototypeOf(Object)); //true

第二行打印为false,而第三行打印为true。有人可以解释原因吗?

2 个答案:

答案 0 :(得分:2)

这是因为所有对象都是一个对象,甚至是它的原型。

但是Foo的原型(Foo.prototype)是一个与Foo不同的对象。

请参阅文档https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/prototype

答案 1 :(得分:1)

Foo.prototype不是Foo函数本身的原型。它是使用new Foo()创建的任何对象的原型。函数Foo的原型只是Function.prototype

console.log(Function.prototype.isPrototypeOf(Foo)); // true
console.log(Foo.prototype.isPrototypeOf(new Foo())); // true

在Object.prototype的情况下,这是原型链的顶部,并且对于任何其他没有明确破坏原型链的东西都会返回true。在Object的情况下,因为它是一个构造函数:

console.log(typeof Object); // function
console.log(Object.__proto__ === Function.prototype); // true

因为Function.prototype本身就是一个对象,所以:

console.log(Object.__proto__.__proto__ === Object.prototype); // true

这就是console.log(Object.prototype.isPrototypeOf(Object));为真的原因,因为Object.prototype存在于Object构造函数的原型链中。具体来说,它是函数原型的原型。

以下是这些对象和函数如何相关的图表。蓝色矩形表示对象,圆角绿色矩形是函数(这是一种特殊类型的对象)。粗黑线是每个对象的原型链,虚线表示使用构造函数的.prototype属性如何关联对象。 Javascript prototype chain