什么是函数的__proto__?

los*_*yzd 24 javascript

我看到这个漂亮的图表,我在Chrome浏览器中做了一些测试,但我不知道如何解释这个:

> Function.prototype
  function Empty() {}
> Function.__proto__
  function Empty() {}
> typeof(Empty)
  "undefined"
Run Code Online (Sandbox Code Playgroud)

是什么function Empty() {},为什么Function.prototypefunction不是object只喜欢Object.prototype

从上图中可以看出,JavaScript中的所有内容都是从Object.prototype我开始的,我是对的吗?

CMS*_*CMS 18

首先,function Empty() {}表示是V8的东西.

在V8中,Function.prototype对象具有"Empty"作为Function.prototype.name属性的值,因此我猜你可能正在使用Chrome的开发者控制台,它以这种方式显示函数的名称.

name函数对象的属性non-standard(不是ECMA-262的一部分),这就是为什么我们看到实现之间的差异.

现在,Function.prototype是一个函数,它总是返回undefined并且可以接受任意数量的参数,但为什么呢?也许只是为了保持一致性,每个内置构造函数的原型都是这样,Number.prototype是一个Number对象,Array.prototype一个Array对象,RegExp.prototype一个RegExp对象,等等......

唯一的区别(例如,在任何函数对象之间Function.prototype)显然是Function.prototype继承自Object.prototype.

似乎javascript中的所有内容都是从Object.prototype开始的,我对吗?

好吧,你是对的Object.prototype是大多数对象的原型链的最后一个对象,但在ECMAScript 5中,你甚至可以创建不从任何东西继承的对象(就像Object.prototype是),并形成另一个继承链,例如:

var parent = Object.create(null),
    child = Object.create(parent);

Object.prototype.isPrototypeOf(parent);  // false

Object.getPrototypeOf(parent);           // null
Object.getPrototypeOf(Object.prototype); // null
Run Code Online (Sandbox Code Playgroud)


sti*_*vlo 6

要整合CMS优秀答案:

似乎javascript中的所有内容都是从Object.prototype开始的,我对吗?

当然,JavaScript中的对象被链接到基本对象.继承链在运行时工作,因此如果修改了基础对象,链接到它的所有内容都将立即继承修改.如果一个Object没有方法或属性,Javascript实现将遵循原型链,直到找到它或它将失败.

__proto__是原型的非标准访问器,跨浏览器支持,但IE不支持.无论如何,应用程序代码并不打算使用它.