ここでは 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)