这个对象布局图很好地解释了javascript中的原型链。但是当谈到以下关系时,我有点困惑:
我的问题是:在上述四个元素中,哪个先来?因为我看到他们之间的循环。
另一个循环是:
这怎么可能?
答案 0 :(得分:0)
您在这里混淆了两个概念,一个是关于本机构造函数的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__
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)