javascript - 函数和对象哪个先出现?

标签 javascript function-object prototype-chain

enter image description here

这个对象布局图很好地解释了 JavaScript 中的原型(prototype)链。但当涉及到以下各项之间的关系时,我有点困惑:

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

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

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

另一个循环是:

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

这怎么可能?

最佳答案

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

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

这里您必须明白,ObjectFunction 本身就是函数,因为构造函数是函数的一种形式。

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

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

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

对于第二个例子:

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

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

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

相关文章:

c++ - 如何将 std::function 分配给 C++ 中的运算符?

javascript - 为什么要将 Something 分配给 Something.prototype.constructor?

javascript - 为 IE6 调试 javascript

javascript - jQuery addclass修改

javascript - 如何使用JQuery高亮文本

c++ - 将 std::get 作为参数传递给函数的函数对象

c++ - 多态中的函数对象

javascript - 尝试通过 .prototype 属性理解/学习/使用 javascript 中的继承

javascript - 原语上的 isPrototypeOf() 函数

javascript - 为什么球在我的 pong JavaScript Canvas 游戏中不能完全弹跳?