ここでは 2 つの概念を混同しています。1 つはネイティブ コンストラクターのprototypeプロパティに関するもので、もう 1 つはこれらのネイティブ コンストラクトのインスタンスの実際のプロトタイプ ( を使用して表されます__proto__) に関するものです。あなたの最初の例では:
function Object.__proto__->Function.prototype
Function.prototype.__proto__->Object.prototype
Object.prototype.constructor->function Object
Objectここで、コンストラクターは関数の形式であるため、とFunction自体が関数であることを理解する必要があります。
#1 では、Objectは関数であり、すべての関数の実際のプロトタイプは ですFunction.prototype。
#2 では、関数インスタンスが自身を継承するプロトタイプが から継承されObject.prototypeます。つまり、関数インスタンスからプロトタイプ チェーンを検索すると、最初に が検索されFunction.prototype、次にが検索されObject.prototypeます。
#3では、constructorプロパティはオブジェクトインスタンスを対象としていますObject.prototypeが、オブジェクト自体です。プロトタイプはありません。
2番目の例:
Function.prototype.constructor->function Function
function Function.__proto__->Function.prototype
プロトタイプにあるものは、実際の関数コンストラクター自体ではなく、インスタンスを意味します。関数のコンストラクターは であるためFunction、それは理にかなっています。
コンストラクターはまだ関数であることを覚えていますか? Function したがって、コンストラクタのプロトタイプは になりますFunction.prototype。Function.prototypeそれ自体がオブジェクトなので、__proto__of がありObject.prototypeます。
実際の関数インスタンスを見ている場合、プロパティがプロトタイプ チェーンを介して検索される方法は次のとおりです。
own properties (on the function itself, functions are special objects)
|
|
↓
Function.prototype (the __proto__ of the function itself)
|
|
↓
Object.prototype (the __proto__ of Function.prototype)
|
|
↓
END (Object.prototype's __proto__ is null)