我看到这个漂亮的图表,我在Chrome浏览器中做了一些测试,但我不知道如何解释这个:
> Function.prototype
function Empty() {}
> Function.__proto__
function Empty() {}
> typeof(Empty)
"undefined"
什么是function Empty() {}
,为什么Function.prototype
是function
而不是object
就像Object.prototype
一样?
从上图中可以看出,JavaScript中的所有内容都是从Object.prototype
开始的,我是否正确?
答案 0 :(得分:17)
首先,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中,你甚至可以创建不从任何东西继承的对象(就像{{1}一样) }),并形成另一个继承链,例如:
Object.prototype
答案 1 :(得分:6)
整合CMS优秀答案:
似乎javascript中的所有内容都是从Object.prototype开始的,我是对的吗?
当然,JavaScript中的对象被链接到基本对象。继承链在运行时工作,因此如果修改了基础对象,链接到它的所有内容都将立即继承修改。如果一个Object没有方法或属性,Javascript实现将遵循原型链,直到找到它或它将失败。
__proto__
是原型的非标准访问者,跨浏览器支持,但IE不支持。无论如何不应该被应用程序代码使用。