)
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
は完全に機能する配列ですか?
コメント
回答
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
はそれとは何の関係もありません。 - なぜ'プッシュなどのすべてのプロパティが実装された通常のオブジェクトであるため、配列インスタンスはそれを継承しますか?
array
が完全に機能しないのですか? "そして、その答えは自明だと思います。クラスの機能を抽象クラスと継承するクラスに分割するのと同じ理由で。Array.prototype
がObject
よりも大きいのはなぜですか?要素を格納する機能を提供するという意味でもっと。[42]
は基本的に{ "0": 42 }
と同じですが、プロトタイプが異なり、ファンキーなlength
プロパティ。length
プロパティがあり、オブジェクトに格納されているプロパティごとに増分されるわけではありません。ここで、Array.prototype
は完全に機能する配列であると言います。