Array.prototypeが完全に機能する配列になるように設計されているのはなぜですか?

以下の視覚化では、

ここに画像の説明を入力してください

2つの配列オブジェクトがあります(cars & <以下の構文で作成されたdivid = "13f1db9f65">

var cars = new Array("Saab", "Volvo", "BMW"); var bikes = ["Honda", "Yamaha"]; 

その[[Class]]プロパティ値はArrayです。

さらに、完全に機能する配列であるArray.prototypeもあります。以下に示すように、

> Object.prototype.toString.call(Array.prototype); "[object Array]" > Array.prototype[0] = "Volvo"; "Volvo" > Array.prototype[1] = "BMW"; "BMW" > Array.prototype.length; 2 

通常、prototypeに何かを置くと、オブジェクトのすべてのインスタンスが同じプロパティ。

質問:

lengthプロパティをメンバーとして、Array.prototypeは完全に機能する配列ですか?

コメント

  • 私の理解では、<オブジェクト> .prプロトタイプの要点は、メソッド名からいくつかの異なるオブジェクトによって共有される実際のメソッドへのマップであるため、ototypeは常にオブジェクトです。' Array.prototypeも配列であるという事実は、すべての配列が特別なオブジェクトであるという事実に関連しています。 Array.prototypeが配列であり、通常のオブジェクトではない理由を尋ねていますか?または、JSプロトタイプが文字列->関数マップに制限されていないのはなぜですか?または、なぜJS配列が特別なオブジェクトなのですか?または他の何か?
  • あなたはおそらく間違った質問をしている'。正しい質問は、"なぜ' t array が完全に機能しないのですか? "そして、その答えは自明だと思います。クラスの機能を抽象クラスと継承するクラスに分割するのと同じ理由で。
  • @Ixrec Array.prototypeObjectよりも大きいのはなぜですか?要素を格納する機能を提供するという意味でもっと。
  • @overexchangeしかし、オブジェクトは要素も格納します。整数キーで要素を格納することを意味する場合、配列はオブジェクトであるため、配列もそれを行いません'。整数キーは常に文字列に変換されます(Javascriptが少し奇妙なため)。 [42]は基本的に{ "0": 42 }と同じですが、プロトタイプが異なり、ファンキーなlengthプロパティ。
  • @Ixrecただし、すべてのオブジェクトにlengthプロパティがあり、オブジェクトに格納されているプロパティごとに増分されるわけではありません。ここで、Array.prototypeは完全に機能する配列であると言います。

回答

Array-prototypeは、オブジェクトが配列として機能するために必要なすべての機能を含む必要があるため、それ自体が完全に機能する配列です。配列インスタンスは、プロトタイプを通じてすべての機能を継承します。

仕様によると:

Arrayプロトタイプオブジェクトはそれ自体が配列です。その[[Class]]は “Array”であり、lengthプロパティ(初期値は+0)と15.4.5.1で説明されている特別な[[DefineOwnProperty]]内部メソッドがあります。

コメント

  • ただし、lengthプロパティはインスタンスレベルのプロパティです。すべての配列インスタンスには、独自のlength値があります。 lengthプロパティをArray.prototypeに配置するのはなぜですか? lengthプロパティをArrayコンストラクター関数に配置することは理にかなっています。インスタンス化すると、すべてのインスタンスに独自の配列の長さを示すプロパティ。ただし、lengthコンストラクター関数のArrayプロパティは、コンストラクター関数が期待する引数の数を示します
  • @overexchange:オブジェクトはコンストラクターからプロパティを継承せず、プロトタイプからのみ継承します。したがって、Array.lengthはArray.prototype.lengthとは関係がありません。
  • @JacquesBこれは、lengthがすべての配列インスタンス間で共有されるプロパティであることを意味します。インスタンスが独自のlengthプロパティを変更するとすぐに、その共有されたlengthがシャドウになり、したがって役に立たなくなります(算術演算によってシャドウが発生するため)たとえば、x.length++は実際にはx.length = x.length + 1です)。つまり、あなたによると、そのプロパティの唯一の使用法であり、すべての配列インスタンスが最初のlengthプロパティを取得しますか?
  • すべての配列オブジェクトには

プロパティ。Array.prototype.lengthから派生したものではありません。Array.prototype[10] = 42を設定してみてください。これにより、Array.prototype.lengthは11になりますが、もちろん、新しく作成された配列はこれを認識しません。 それらは要素を継承します-[][10]を試してください。 ほとんど望ましい動作ではありません。 Array.prototypeが配列である理由が何であれ、lengthはそれとは何の関係もありません。

  • なぜ'プッシュなどのすべてのプロパティが実装された通常のオブジェクトであるため、配列インスタンスはそれを継承しますか?
  • コメントを残す

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です