なぜF
場合 - シンプルな機能:なぜF - シンプルな関数:F.prototype!== F .__ proto__しかしFunction.prototype ===関数.__ proto__?
F.prototype !== F.__proto__
しかし
Function.prototype === Function.__proto__
?
なぜF
場合 - シンプルな機能:なぜF - シンプルな関数:F.prototype!== F .__ proto__しかしFunction.prototype ===関数.__ proto__?
F.prototype !== F.__proto__
しかし
Function.prototype === Function.__proto__
?
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
です。
downvoterは説明する気に? –
Function.prototype === Function .__ proto__ –
「Function」は特別な雪片ですか? – Bergi
なぜそれがそうでないと思いますか?他に何を参照すると思いましたか? – Bergi