)
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は完全に機能する配列であると言います。