为什么如果F - 简单函数:F.prototype!== F .__ proto__但是Function.prototype ===函数.__ proto__?

时间:2017-05-14 10:29:24

标签: javascript oop prototype proto function.prototype

为什么F - 简单函数:

F.prototype !== F.__proto__

Function.prototype === Function.__proto__ 

1 个答案:

答案 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