为什么 Javascript 中的构造函数的原型不是 Function?

Why don't constructor functions in Javascript have Function as their prototype?

我正在学习 Javascript,我最近学习了一些关于原型的知识。我对原型的理解是,它们实际上是内存中的对象,每个新创建的对象都有一个指向的指针。当创建一个新对象时,用于创建该对象的构造函数将新创建对象的原型指定为构造函数的原型。换句话说,如果我有一个 Circle 构造函数,并且我创建了一个新的 Circle 对象,那么这个新对象和 Circle 构造函数都指向同一个引用。

我的问题是:如果原型应该引用创建对象的 "parent" 对象,例如构造函数,为什么构造函数不指向"Function"构造函数作为他们的原型?如果您尝试像这样创建一个新的构造函数:

function Circle() {}
let c1 = new Circle();

您会看到 c1 具有以下原型,这是有道理的,因为 Circle 构造函数创建了它

Circle {}
__proto__:
constructor: ƒ Circle()
__proto__: Object

Circle.prototype与上面是同一个对象。那么为什么 Circle.prototype 不指向 Function 作为原型呢?

如您所见,以下是true:

Object.getPrototypeOf(c1) === Circle.prototype

所以从逻辑上讲,如果我们认为 CircleFunction 的一个实例,那么:

Object.getPrototypeOf(Circle) === Function.prototype

您可以在下方确认:

// let Circle = new Function(); /* also works here */
function Circle() {}
let c1 = new Circle();

console.log(Object.getPrototypeOf(c1) === Circle.prototype);
console.log(Object.getPrototypeOf(Circle) === Function.prototype);

The Object.getPrototypeOf() method returns the prototype (i.e. the value of the internal [[Prototype]] property) of the specified object.

不要与 Circle.prototype 混淆。您可以在 MDN's article on Object prototypes, or feel free to browse any of the answers to __proto__ VS. prototype in JavaScript.

中阅读更多关于它们之间区别的信息

请注意 Circle.__proto__Object.getPrototypeOf(Circle) 是等价的,但是 __proto__ 是非标准的(尽管它恰好在 JavaScript 的几乎每个实现中都定义了,因为向后兼容的历史用法)。