为什么如果F
- 简单的功能:
F.prototype !== F.__proto__
但
Function.prototype === Function.__proto__
?
为什么如果F
- 简单的功能:
F.prototype !== F.__proto__
但
Function.prototype === Function.__proto__
?
F.prototype !== F.__proto__
假设您正在为所有函数设计一个 API。所以你定义每个函数都应该有方法call
。你用这样的方法创建一个对象:
var fproto = {call: ()=>{}};
然后,要让所有函数共享此功能,您必须将其添加到.prototype
Function 构造函数的属性中,以便 Function 的所有实例都继承它。因此,您执行以下操作:
Function.prototype = fproto.
现在,当您创建一个函数时F
,它将.__proto__
设置为fproto
:
const F = new Function();
F.call(); // works because of lookup in prototype chain through `__proto__` property
F.__proto__ === Function.prototype; // true
现在您决定使用F
构造函数创建的所有实例都应该有一个方法custom
,因此您使用该属性创建一个对象iproto
并将其设置为所有F
使用prototype
属性实例的原型:
const iproto = {custom: ()=>{}};
F.prototype = iproto;
const myobj = new F();
myobj.custom(); // works
所以现在应该清楚了,F.__proto__
和F.prototype
不是同一个对象。当你声明一个函数时,这本质上就是幕后发生的事情:
const F = function() {};
// F.__proto__ is set to Function.prototype to inherit `call` and other methods
F.__proto__ === Function.prototype
// F.prototype is set to a new object `{constructor: F}` and so:
F.prototype !== Function.prototype
Function.prototype === Function.__proto__
是一个例外情况,因为Function
构造函数应该具有可用于函数实例的所有方法,因此Function.__proto__
,但所有方法都与函数实例共享这些方法,因此Function.prototype
.