Miért tervezték az Array.prototype-t teljesen funkcionális tömbnek?

Az alábbi megjelenítésben

írja ide a kép leírását

Két tömbobjektum létezik (cars & bikes), amelyek szintaxissal vannak létrehozva,

var cars = new Array("Saab", "Volvo", "BMW"); var bikes = ["Honda", "Yamaha"]; 

akiknek [[Class]] tulajdonság értéke Array.

Ezenkívül van még Array.prototype is, amely teljesen funkcionális tömb, mint alább látható,

> Object.prototype.toString.call(Array.prototype); "[object Array]" > Array.prototype[0] = "Volvo"; "Volvo" > Array.prototype[1] = "BMW"; "BMW" > Array.prototype.length; 2 

Általában, ha valamit felhelyez a prototype fájlra, az objektum minden példánya megosztja a ugyanazok a tulajdonságok.

Kérdés:

length tulajdonsággal tagként, Mi az ötlet a Array.prototype teljesen működőképes tömb?

Megjegyzések

  • Megértésem szerint < objektum > .pr Az ototípus mindig objektum, mert a prototípus lényege, hogy ' térképet mutat a metódusok nevétől a tényleges módszerekig, amelyeket több különböző objektum oszt meg. Az a tény, hogy az Array.prototype is tömb, összefügg azzal a ténnyel, hogy minden tömb speciális objektum. Azt kérdezi, hogy az Array.prototype miért tömb és nem szabályos objektum? Vagy miért nem korlátozódnak a JS prototípusok a string – > függvénytérképekre? Vagy miért a JS tömbök speciális objektumok? Vagy valami mást?
  • Valószínűleg rossz kérdést tesz fel '. A helyes kérdés az, hogy " miért nem ' t array nem működik teljesen? " És úgy gondolom, hogy a válasz erre magától értetődő: ugyanazokból az okokból, amelyek miatt az osztály funkcionalitását elvont osztályra és osztályra osztja, amely ez.
  • @Ixrec Miért <

több, mint Object? Inkább abban az értelemben, hogy lehetőséget kínálunk az elemek tárolására.

  • @overexchange Ha az elemeket egész kulcsokkal tárolja, akkor a tömbök ezt sem teszik meg, mert a tömbök objektumok. Az egész kulcsok mindig karakterláncokká alakulnak át (mert a Javascript egy kicsit furcsa). A [42] lényegében ugyanaz, mint a { "0": 42 }, de más prototípussal rendelkezik, és ez a funky length tulajdonság.
  • @Ixrec De nem minden objektum rendelkezik length tulajdonsággal, amely növekszik az objektumban tárolt minden tulajdonság után. Itt mondom, hogy a Array.prototype teljes mértékben tömb.
  • Válasz

    Az Array-prototípus maga is egy teljesen funkcionális tömb, mert tartalmaznia kell mindazon funkciókat, amelyek szükségesek ahhoz, hogy egy objektum tömbként funkcionáljon. Az Array-példányok minden funkciójukat a prototípuson keresztül öröklik.

    A szerint a specifikáció :

    Az Array prototípus objektum maga egy tömb; [[Osztálya]] “tömb”, hossztulajdonsággal rendelkezik (amelynek kezdeti értéke +0), valamint a 15.4.5.1. szakaszban leírt speciális [[DefineOwnProperty]] belső módszerrel.

    megjegyzések

    • De a length tulajdonság példányszintű tulajdonság. Minden tömbpéldánynak megvan a maga length értéke. Miért helyezné el a length tulajdonságot a Array.prototype helyre? Érdemes lenne length tulajdonságot elhelyezni a Array konstruktor funkcióban, a példányosításkor minden példánynak meg lesz a maga length tulajdonság, amely a tömb hosszát jelzi. De a Array konstruktor függvény length tulajdonsága a konstruktor függvény által elvárt argumentumok számát jelöli
    • @overexchange: Az objektumok nem nem örökölheti a tulajdonságokat a konstruktortól, csak a prototípustól. Ezért az Array.length nincs kapcsolatban az Array.prototype.length-rel.
    • @JacquesB Ez azt jelenti, hogy a length az összes tömbpéldány megosztott tulajdonsága, és amint egy példány módosítja a saját length tulajdonságát, a megosztott length árnyékolva lesz, és ezért haszontalan (mert minden számtani művelet árnyékot eredményez előfordul, pl. x.length++ valójában x.length = x.length + 1). Tehát szerinted ez a tulajdonság az egyetlen, hogy az összes tömbpéldány kezdeti length tulajdonságot kapjon?
    • Minden tömbobjektumnak van length tulajdonság, amely semmiképpen sem származik a Array.prototype.length -ből.Csak próbálja meg beállítani a Array.prototype[10] = 42 beállítást, amellyel a Array.prototype.length értéke 11, de természetesen az újonnan létrehozott tömbök ezt nem veszik fel. Ők öröklik az elemet – próbálkozzon [][10]. Alig kívánatos viselkedés. Bármi is lehet az oka annak, hogy az Array.prototype tömb legyen, a length semmi köze hozzá.
    • Miért ' ez egy közönséges objektum, amelynek összes tulajdonsága, például a push stb. megvalósítva van, így a tömbpéldány örökli tőle?

    Vélemény, hozzászólás?

    Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük