什么是函数的__proto__?

时间:2011-10-07 14:47:39

标签: javascript

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

> Function.prototype
  function Empty() {}
> Function.__proto__
  function Empty() {}
> typeof(Empty)
  "undefined"

什么是function Empty() {},为什么Function.prototypefunction而不是object就像Object.prototype一样?

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

2 个答案:

答案 0 :(得分:17)

首先,function Empty() {}表示是V8个东西。

在V8中,Function.prototype对象有"Empty“作为Function.prototype.name属性的值,所以我猜您可能正在使用Chrome的开发者控制台,它会显示名称以这种方式的功能。

函数对象的name属性为non-standard(不属于ECMA-262),这就是我们看到实现之间差异的原因。

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

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

  

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

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

Object.prototype

答案 1 :(得分:6)

整合CMS优秀答案:

  

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

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

__proto__是原型的非标准访问者,跨浏览器支持,但IE不支持。无论如何不应该被应用程序代码使用。