1

ここに画像の説明を入力

このオブジェクト レイアウト図では、javascript でプロトタイプ チェーンをうまく説明しています。しかし、次の関係については少し混乱します。

  1. 関数オブジェクト(){}
  2. オブジェクトのプロトタイプ
  3. 関数関数(){}
  4. Function.prototype

私の質問は、上記の 4 つの要素のうち、最初に来るのはどれですか? それらの間にサイクルが見えるからです。

  1. 関数 Object.____proto____ -> Function.prototype
  2. Function.prototype.____proto____ -> Object.prototype
  3. Object.prototype.constructor -> 関数オブジェクト

また、別のサイクルは次のとおりです。

  1. Function.prototype.constructor -> 関数 関数
  2. 関数 Function.____proto____ -> Function.prototype

そんなことがあるものか?

4

1 に答える 1

1

ここでは 2 つの概念を混同しています。1 つはネイティブ コンストラクターのprototypeプロパティに関するもので、もう 1 つはこれらのネイティブ コンストラクトのインスタンスの実際のプロトタイプ ( を使用して表されます__proto__) に関するものです。あなたの最初の例では:

  1. function Object.__proto__->Function.prototype
  2. Function.prototype.__proto__->Object.prototype
  3. Object.prototype.constructor->function Object

Objectここで、コンストラクターは関数の形式であるため、とFunction自体が関数であることを理解する必要があります。

#1 では、Objectは関数であり、すべての関数の実際のプロトタイプは ですFunction.prototype

#2 では、関数インスタンスが自身を継承するプロトタイプが から継承されObject.prototypeます。つまり、関数インスタンスからプロトタイプ チェーンを検索すると、最初に が検索されFunction.prototype、次にが検索されObject.prototypeます。

#3では、constructorプロパティはオブジェクトインスタンスを対象としていますObject.prototypeが、オブジェクト自体です。プロトタイプはありません。

2番目の例:

  1. Function.prototype.constructor->function Function
  2. function Function.__proto__->Function.prototype

プロトタイプにあるものは、実際の関数コンストラクター自体ではなく、インスタンスを意味します。関数のコンストラクターは であるためFunction、それは理にかなっています。

コンストラクターはまだ関数であることを覚えていますか? Function したがって、コンストラクタのプロトタイプは になりますFunction.prototypeFunction.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)     
于 2014-05-19T09:18:05.007 に答える