一图搞懂继承:
1,Object类是Function类的实例,所以Object.__proto__指向了Function.prototype;
2,Function类是不是Function对象创造出来的实例:
对于 Function.__proto__ === Function.prototype
这一现象有 2 种解释,争论点在于 Function 对象是不是由 Function 构造函数创建的一个实例?
解释 1、YES:按照 JavaScript 中“实例”的定义,a 是 b 的实例即 a instanceof b
为 true,默认判断条件就是 b.prototype
在 a 的原型链上。而 Function instanceof Function
为 true,本质上即 Object.getPrototypeOf(Function) === Function.prototype
,正符合此定义。
解释 2、NO:Function 是 built-in
的对象,也就是并不存在“Function对象由Function构造函数创建”这样显然会造成鸡生蛋蛋生鸡的问题。实际上,当你直接写一个函数时(如 function f() {}
或 x => x
),也不存在调用 Function 构造器,只有在显式调用 Function 构造器时(如 new Function('x', 'return x')
)才有。
我个人偏向于第二种解释,即先有 Function.prototype
然后有的 function Function()
,所以就不存在鸡生蛋蛋生鸡问题了,把 Function.__proto__
指向 Function.prototype
是为了保证原型链的完整,让 Function
可以获取定义在 Object.prototype
上的方法。