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
length
je však vlastnost na úrovni instance. Každá instance pole má svou vlastnílength
hodnotu. Proč byste umístili vlastnostlength
doArray.prototype
? Dalo by smysl umístit vlastnostlength
doArray
funkce konstruktoru, po vytvoření instance bude mít každá instance vlastnílength
Vlastnost, která označuje délku pole. Alelength
vlastnostArray
funkce 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
length
je sdílená vlastnost mezi všemi instancemi pole a jako jakmile instance upraví svou vlastnílength
vlastnost, stane se sdílenálength
stí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ílength
vlastnost? - Každý objekt pole má
length
vlastnost, která v žádném případě není odvozena odArray.prototype.length
.Zkuste zkusit nastavitArray.prototype[10] = 42
, čímž seArray.prototype.length
rovná 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í,length
s 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?
array
plně 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.prototype
ví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 funkylength
vlastnost.length
vlastnost, která se zvyšuje pro každou vlastnost uloženou v objektu. Zde říkám, žeArray.prototype
je plně funkční pole.