În vizualizarea de mai jos,
Există două obiecte matrice (cars
& bikes
) care sunt create cu sintaxa de mai jos,
var cars = new Array("Saab", "Volvo", "BMW"); var bikes = ["Honda", "Yamaha"];
al cărui [[Class]]
valoarea proprietății este Array
.
În plus, avem și Array.prototype
, care este un tablou complet funcțional, ca afișat mai jos,
> Object.prototype.toString.call(Array.prototype); "[object Array]" > Array.prototype[0] = "Volvo"; "Volvo" > Array.prototype[1] = "BMW"; "BMW" > Array.prototype.length; 2
În general, când puneți ceva pe prototype
, fiecare instanță a obiectului împarte aceleași proprietăți.
Întrebare:
Având proprietatea length
ca membru, care este ideea din spatele Array.prototype
fiind un tablou complet funcțional?
Comentarii
nu faceți acest lucru, deoarece matricele sunt obiecte. Cheile întregi sunt întotdeauna convertite în șiruri (deoarece Javascript este puțin ciudat). [42]
este în esență același lucru cu { "0": 42 }
, dar cu un prototip diferit și acel length
proprietate.
length
proprietate care se incrementează pentru fiecare proprietate stocată în obiect. Aici spun că Array.prototype
este un tablou complet funcțional. Răspuns
Prototipul Array este el însuși un tablou complet funcțional, deoarece trebuie să conțină toate funcționalitățile necesare pentru ca un obiect să funcționeze ca un tablou. Instanțele Array își moștenesc toate funcționalitățile prin intermediul prototipului.
Conform specificației :
Obiectul prototip Array este el însuși o matrice; [[Class]] este „Array” și are o proprietate de lungime (a cărei valoare inițială este +0) și metoda internă [[DefineOwnProperty]] descrisă la 15.4.5.1.
Comentarii
- Dar proprietatea
length
este proprietate la nivel de instanță. Fiecare instanță de matrice are propria sa valoarelength
. De ce ați plasa proprietatealength
înArray.prototype
? Ar avea sens să plasațilength
proprietate în funcția de constructorArray
, la instanțiat, fiecare instanță va avea propriullength
proprietate care semnifică lungimea matricei. Darlength
proprietateaArray
funcția constructor semnifică numărul de argumente așteptate de funcția constructor - @overexchange: Objects does nu moștenesc proprietăți de la constructor, ci doar de la prototip. Prin urmare, Array.length nu are nicio relație cu Array.prototype.length.
- @JacquesB Aceasta înseamnă că
length
este o proprietate partajată între toate instanțele matricei și ca imediat ce o instanță își modifică propria proprietatelength
, acealength
partajată devine umbrită și, prin urmare, inutilă (deoarece orice operație aritmetică are ca rezultat o umbrire care apare, de ex.x.length++
este de faptx.length = x.length + 1
). Deci, este singura utilizare a acelei proprietăți, conform dvs., astfel încât toate instanțele matricei să primească o proprietate inițialălength
? - Fiecare obiect matrice are id = „944c4209f5″>
proprietate care nu este derivată în niciun fel din Array.prototype.length
.Încercați doar să setați Array.prototype[10] = 42
, ceea ce face ca Array.prototype.length
să fie egal cu 11, dar, bineînțeles, matricile nou create nu ridică acest lucru. Ei moștenesc elementul – încercați [][10]
. Cu greu un comportament de dorit. Oricare ar fi motivul pentru care Array.prototype este un tablou, length
nu are nimic de-a face cu el.
array
nu este complet funcțional? " Și cred că răspunsul la asta este evident: din aceleași motive pentru care ați împărțit funcționalitatea unei clase într-o clasă abstractă și o clasă care moștenește de la it.Array.prototype
este mai mult decâtObject
? Mai mult în sensul de a oferi facilități pentru stocarea elementelor.