当我执行代码时:
console.log(Function.prototype);
它返回:
function Empty() {}
(至少在Chrome中)
为什么会这样?我的印象是原型几乎总是直观的对象文字,而且几乎在我检查过的其他地方似乎都是如此。我很好奇为什么Function.prototype会解析为不同的东西。
答案 0 :(得分:2)
因为这是ECMAScript 5所要求的。
15.3.4 Properties of the Function Prototype Object
Function
原型对象本身就是一个Function对象(它的[[Class]]
是“Function”),当被调用时,它接受任何参数并返回undefined
。
大多数(或所有?)其他本机构造函数都将原型定义为生成的相同类型的对象。
考虑到原型对象包含该类型的方法,这些方法在该对象上调用时应该正常工作是有意义的。
答案 1 :(得分:0)
首先要注意一个对象的实际原型,就像对象继承行为的东西一样,存储在它的__proto__属性中(在大多数实现中 - thx @the system)。 Function对象的“prototype”属性是它自己的__proto__,它是一个特殊的内置函数文字单例对象function(){}
(Chrome的console.log()必须打印为function Empty() {}
,无论出于何种原因,但它是相同的东西) 。由于所有函数都是对象(但并非所有对象都是函数),因此该对象的__proto__是另一个特殊的内置文字单例对象[object Object]
。 [object Object]
__ proto__为空。 [object Object]
是原型链的根源。
检查输出结果显示事物的排列方式(可从命令行解释程序运行)。
print( Function.prototype === Function.__proto__ );
var f = new Funtion();
print( f.__proto__ === Function.prototype );
print( f.__proto__ );
print( f.__proto__.__proto__ );
print( f.__proto__.__proto__.proto__ );
现在,内置JavaScript对象具有一个名为“class”的属性。此属性是不可变的,由JavaScript引擎本身设置。 JavaScript使用该类用于特殊内部目的。 Javascript需要知道这一点,因此它知道可以调用Function对象(如@thesystem - http://es5.github.com/#x15.3.4给出的先前答案中的链接所暗示的那样)。来自规范:
“[[Class]]内部属性的值由此规范为每种内置对象定义。宿主对象的[[Class]]内部属性的值可以是任何String值,除了“Arguments”,“Array”,“Boolean”,“Date”,“Error”,“Function”,“JSON”,“Math”,“Number”,“Object”,“RegExp”和“String”之一。[[Class]]内部属性的值在内部用于区分不同类型的对象。注意,除了通过Object.prototype.toString之外,本规范没有为程序提供任何访问该值的方法(见15.2.4.2) )“。 - http://es5.github.com/#x8.6.2
Function对象的原型AKA function(){}
的“类”是“Function”。 Function类也是“Function”。创建新对象时,Javascript根据其构造函数的class属性直接设置其类属性,这对于对象的生命周期是不可变的。