这个对象布局图很好地解释了 JavaScript 中的原型(prototype)链。但当涉及到以下各项之间的关系时,我有点困惑:
- 函数对象(){}
- 对象.prototype
- 函数 Function(){}
- 函数.原型(prototype)
我的问题是:以上四个要素中,哪个在先?因为我看到它们之间有一个循环。
- 函数对象.____proto____ -> Function.prototype
- Function.prototype.____proto____ -> Object.prototype
- Object.prototype.constructor -> 函数对象
另一个循环是:
- Function.prototype.constructor -> 函数功能
- 函数 Function.____proto____ -> Function.prototype
这怎么可能?
最佳答案
您在这里混淆了两个概念,一个是关于 native 构造函数的 prototype
属性,以及这些 native 构造实例的实际原型(prototype)(使用 __proto__
表示) )。在您的第一个示例中:
function Object.__proto__
->Function.prototype
Function.prototype.__proto__
->Object.prototype
Object.prototype.constructor
->function Object
这里您必须明白,Object
和 Function
本身就是函数,因为构造函数是函数的一种形式。
在#1中,Object
是一个函数,所有函数的实际原型(prototype)都是Function.prototype
。
在#2 中,函数instances 继承的原型(prototype)继承自Object.prototype
。这意味着当您从函数实例查找原型(prototype)链时,它将首先查看Function.prototype
,然后查看Object.prototype
。
在 #3 中,constructor
属性适用于对象实例,尽管 Object.prototype
本身就是一个对象。它没有原型(prototype)。
对于第二个例子:
Function.prototype.constructor
->function Function
function Function.__proto__
->Function.prototype
原型(prototype)中的内容适用于实例,而不是实际的函数构造函数本身。因为任何函数的构造函数都是 Function
,所以这是有道理的。
还记得构造函数仍然是函数吗?因此,Function
构造函数的原型(prototype)将是Function.prototype
。 Function.prototype
本身是一个对象,因此它会有一个 __proto__
为 Object.prototype
。
当您查看实际的函数实例时,以下是通过原型(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)
关于javascript - 函数和对象哪个先出现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23733696/