您在这里混淆了两个概念,一个是关于本机构造函数的prototype
属性和这些本机构造实例的实际原型(用 表示__proto__
)。在您的第一个示例中:
function Object.__proto__
->Function.prototype
Function.prototype.__proto__
->Object.prototype
Object.prototype.constructor
->function Object
你必须在这里理解它Object
本身Function
就是函数,因为构造函数是函数的一种形式。
在#1 中,Object
是一个函数,所有函数的实际原型是Function.prototype
.
在 #2 中,函数实例继承自身的原型继承自Object.prototype
. 这意味着当您从函数实例中查找原型链时,它将首先查看Function.prototype
,然后查看Object.prototype
。
在 #3 中,该constructor
属性适用于对象实例,尽管Object.prototype
它本身就是一个对象。它没有原型。
对于您的第二个示例:
Function.prototype.constructor
->function Function
function Function.__proto__
->Function.prototype
原型中的内容是针对实例的,而不是实际的函数构造函数本身。因为任何函数的构造函数都是Function
,这是有道理的。
还记得构造函数仍然是函数吗?因此Function
构造函数的原型将是Function.prototype
. Function.prototype
本身是一个对象,所以它会有一个__proto__
of Object.prototype
。
当您查看实际的函数实例时,以下是通过原型链查找属性的方式:
own properties (on the function itself, functions are special objects)
|
|
↓
Function.prototype (the __proto__ of the function itself)
|
|
↓
Object.prototype (the __proto__ of Function.prototype)
|
|
↓
END (Object.prototype's __proto__ is null)