为什么F
- 简单函数:
F.prototype !== F.__proto__
但
Function.prototype === Function.__proto__
答案 0 :(得分:1)
F.prototype !== F.__proto__
假设您正在为所有功能设计API。因此,您定义每个函数都应该具有方法call
。您可以使用以下方法创建对象:
var fproto = {call: ()=>{}};
然后,对于共享此功能的所有函数,必须将其添加到Function构造函数so that all instances of a Function inherit it的.prototype
属性中。所以你要做到以下几点:
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
。