Î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
lengtheste 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țilengthproprietate în funcția de constructorArray, la instanțiat, fiecare instanță va avea propriullengthproprietate care semnifică lungimea matricei. DarlengthproprietateaArrayfuncț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ă
lengtheste o proprietate partajată între toate instanțele matricei și ca imediat ce o instanță își modifică propria proprietatelength, acealengthpartajată 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.
arraynu 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.prototypeeste mai mult decâtObject? Mai mult în sensul de a oferi facilități pentru stocarea elementelor.