首先是功能还是对象?

时间:2014-05-19 09:01:23

标签: javascript function-object prototype-chain

enter image description here

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

  1. function Object(){}
  2. Object.prototype中
  3. function Function(){}
  4. Function.prototype的
  5. 我的问题是:在上述四个元素中,哪个先来?因为我看到他们之间的循环。

    1. function Object .____ proto____ - > Function.prototype的
    2. Function.prototype .____ proto____ - > Object.prototype中
    3. Object.prototype.constructor - > function Object
    4. 另一个循环是:

      1. Function.prototype.constructor - >功能功能
      2. 功能函数.____ proto____ - > Function.prototype的
      3. 这怎么可能?

1 个答案:

答案 0 :(得分:0)

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

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

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

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

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

在#3中,constructor属性适用于对象实例,但Object.prototype是对象本身。它没有原型。

对于你的第二个例子:

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

原型中的内容是针对实例,而不是实际的函数构造函数本身。因为任何函数的构造函数都是Function,所以这是有道理的。

还记得构造函数仍然是函数吗?因此,Function 构造函数的原型将为Function.prototypeFunction.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)