web-dev-qa-db-ja.com

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

以下の視覚化では、

enter image description here

以下の構文で作成された2つの配列オブジェクト(carsbikes)があります。

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が完全に機能する配列の背後にあるアイデアは何ですか?

5
overexchange

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

スペック によると:

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

2
JacquesB