Ve vizualizaci níže
Existují dva objekty pole (cars & bikes), které jsou vytvořeny s níže uvedenou syntaxí,
var cars = new Array("Saab", "Volvo", "BMW"); var bikes = ["Honda", "Yamaha"];
jehož [[Class]] hodnota vlastnosti je Array.
Kromě toho máme také Array.prototype, což je plně funkční pole, protože zobrazeno níže,
> Object.prototype.toString.call(Array.prototype); "[object Array]" > Array.prototype[0] = "Volvo"; "Volvo" > Array.prototype[1] = "BMW"; "BMW" > Array.prototype.length; 2
Obecně platí, že když něco umístíte na prototype, každá instance objektu sdílí stejné vlastnosti.
Otázka:
S členem length, jaká je myšlenka Array.prototype být plně funkční pole?
Komentáře
Odpovědět
Prototyp pole je sám o sobě plně funkční pole, protože musí obsahovat všechny funkce, které jsou nezbytné pro to, aby objekt fungoval jako pole. Instance Array dědí všechny své funkce prostřednictvím prototypu.
Podle specifikace :
Prototyp objektu Array je sám o sobě maticí; jeho [[Class]] je „Array“ a má vlastnost length (jejíž počáteční hodnota je +0) a speciální interní metodu [[DefineOwnProperty]] popsanou v 15.4.5.1.
Komentáře
- Vlastnost
lengthje však vlastnost na úrovni instance. Každá instance pole má svou vlastnílengthhodnotu. Proč byste umístili vlastnostlengthdoArray.prototype? Dalo by smysl umístit vlastnostlengthdoArrayfunkce konstruktoru, po vytvoření instance bude mít každá instance vlastnílengthVlastnost, která označuje délku pole. AlelengthvlastnostArrayfunkce konstruktoru znamená počet argumentů očekávaných funkcí konstruktoru - @overexchange: Objects does nezdědí vlastnosti od konstruktoru, pouze od prototypu. Proto Array.length nemá žádný vztah k Array.prototype.length.
- @JacquesB To znamená, že
lengthje sdílená vlastnost mezi všemi instancemi pole a jako jakmile instance upraví svou vlastnílengthvlastnost, stane se sdílenálengthstínovaná, a proto nepoužitelná (protože každá aritmetická operace má za následek stínování vyskytující se, např.x.length++je ve skutečnostix.length = x.length + 1). Je tedy podle vás jediným použitím této vlastnosti, aby všechny instance pole získaly počátečnílengthvlastnost? - Každý objekt pole má
lengthvlastnost, která v žádném případě není odvozena odArray.prototype.length.Zkuste zkusit nastavitArray.prototype[10] = 42, čímž seArray.prototype.lengthrovná 11, ale nově vytvořená pole to samozřejmě nevyzvednou. Zdědí prvek – zkuste[][10]. Sotva žádoucí chování. Ať už je důvod, proč Array.prototype může být maticí,lengths tím nemá nic společného. - Proč ' nejde o obyčejný objekt se všemi vlastnostmi, jako je push atd., takže z něj dědí instance Array?
arrayplně funkční? " A myslím, že odpověď na to je samozřejmá: ze stejných důvodů rozdělujete funkčnost třídy na abstraktní třídu a třídu, která dědí z it.Array.prototypevíce nežObject? Více v tom smyslu, že poskytuje zařízení pro ukládání prvků.[42]je v podstatě to samé jako{ "0": 42 }, ale s jiným prototypem a tím funkylengthvlastnost.lengthvlastnost, která se zvyšuje pro každou vlastnost uloženou v objektu. Zde říkám, žeArray.prototypeje plně funkční pole.