我试图在chrome控制台中执行以下行。
function Foo() {}
console.log(Foo.prototype.isPrototypeOf(Foo)); // false
console.log(Object.prototype.isPrototypeOf(Object)); //true
第二行打印为false,而第三行打印为true。有人可以解释原因吗?
答案 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
属性如何关联对象。