Proč je Array.prototype navržen jako plně funkční pole?

Ve vizualizaci níže

zde zadejte popis obrázku

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

  • Chápu, že < objekt > .pr ototyp je vždy objekt, protože hlavním bodem prototypu je to, že ' je mapa od názvů metod ke skutečným metodám sdíleným několika různými objekty. Skutečnost, že Array.prototype je také pole, souvisí se skutečností, že všechna pole jsou speciální objekty. Ptáte se, proč je Array.prototype pole a ne běžný objekt? Nebo proč se prototypy JS neomezují pouze na řetězec – > funkční mapy? Nebo proč jsou pole JS speciální objekty? Nebo něco jiného?
  • Pravděpodobně se ' ptáte špatně. Správná otázka je " proč není ' t 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.
  • @Ixrec Proč je Array.prototype více než Object? Více v tom smyslu, že poskytuje zařízení pro ukládání prvků.
  • @overexchange Ale objekty také ukládají prvky. Pokud máte na mysli ukládání prvků s celočíselnými klíči, pole to nedělají, protože pole jsou objekty. Celočíselné klíče se vždy převedou na řetězce (protože Javascript je trochu divný). [42] je v podstatě to samé jako { "0": 42 }, ale s jiným prototypem a tím funky length vlastnost.
  • @Ixrec Ale ne všechny objekty mají length vlastnost, která se zvyšuje pro každou vlastnost uloženou v objektu. Zde říkám, že Array.prototype je plně funkční pole.

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 vlastnost length do Array.prototype? Dalo by smysl umístit vlastnost length do Array funkce konstruktoru, po vytvoření instance bude mít každá instance vlastní length Vlastnost, která označuje délku pole. Ale length vlastnost Array 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čnosti x.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 od Array.prototype.length.Zkuste zkusit nastavit Array.prototype[10] = 42, čímž se Array.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?

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *