2017-05-14 14 views

答えて

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を作成するとき、それはfprotoにその.__proto__セットを持っています。

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プロパティを使用して設定します。

ここで、F.__proto__F.prototypeは同じオブジェクトではありません。 Functionコンストラクタは、関数のインスタンスで使用可能なすべてのメソッドを持っている必要があるため

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.__proto__:これは、関数を宣言するときにボンネットの下に何が起こるか、本質的ですすべてがこれらのメソッドを関数インスタンスと共有するため、Function.prototypeです。

+1

downvoterは説明する気に? –

関連する問題