1

在此处输入图像描述

有这个对象布局图很好地解释了javascript中的原型链。但是当谈到以下之间的关系时,我有点困惑:

  1. 函数对象(){}
  2. 对象.原型
  3. 函数函数(){}
  4. 函数原型

我的问题是:在上述四个要素中,哪个先出现?因为我看到了它们之间的循环。

  1. 函数对象.____proto____ -> Function.prototype
  2. Function.prototype.____proto____ -> Object.prototype
  3. Object.prototype.constructor -> 函数对象

还有另一个循环是:

  1. Function.prototype.constructor -> 函数函数
  2. 函数 Function.____proto____ -> Function.prototype

这怎么可能?

4

1 回答 1

1

您在这里混淆了两个概念,一个是关于本机构造函数的prototype属性和这些本机构造实例的实际原型(用 表示__proto__)。在您的第一个示例中:

  1. function Object.__proto__->Function.prototype
  2. Function.prototype.__proto__->Object.prototype
  3. Object.prototype.constructor->function Object

你必须在这里理解它Object本身Function就是函数,因为构造函数是函数的一种形式。

在#1 中,Object是一个函数,所有函数的实际原型是Function.prototype.

在 #2 中,函数实例继承自身的原型继承自Object.prototype. 这意味着当您从函数实例中查找原型链时,它将首先查看Function.prototype,然后查看Object.prototype

在 #3 中,该constructor属性适用于对象实例,尽管Object.prototype它本身就是一个对象。它没有原型。

对于您的第二个示例:

  1. Function.prototype.constructor->function Function
  2. 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)     
于 2014-05-19T09:18:05.007 回答