Az alábbi megjelenítésben
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
több, mint Object
? Inkább abban az értelemben, hogy lehetőséget kínálunk az elemek tárolására.
[42]
lényegében ugyanaz, mint a { "0": 42 }
, de más prototípussal rendelkezik, és ez a funky length
tulajdonság. 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.
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 magalength
értéke. Miért helyezné el alength
tulajdonságot aArray.prototype
helyre? Érdemes lennelength
tulajdonságot elhelyezni aArray
konstruktor funkcióban, a példányosításkor minden példánynak meg lesz a magalength
tulajdonság, amely a tömb hosszát jelzi. De aArray
konstruktor függvénylength
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átlength
tulajdonságát, a megosztottlength
árnyékolva lesz, és ezért haszontalan (mert minden számtani művelet árnyékot eredményez előfordul, pl.x.length++
valójábanx.length = x.length + 1
). Tehát szerinted ez a tulajdonság az egyetlen, hogy az összes tömbpéldány kezdetilength
tulajdonságot kapjon? - Minden tömbobjektumnak van
length
tulajdonság, amely semmiképpen sem származik aArray.prototype.length
-ből.Csak próbálja meg beállítani aArray.prototype[10] = 42
beállítást, amellyel aArray.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, alength
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?
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.