De ce este proiectat Array.prototype pentru a fi un tablou complet funcțional?

În vizualizarea de mai jos,

introduceți descrierea imaginii aici

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

  • Înțeleg că acel < obiect > .pr ototipul este întotdeauna un obiect, deoarece întregul punct al unui prototip este că ' este o hartă de la nume de metode la metode reale împărtășite de mai multe obiecte diferite. Faptul că Array.prototype este, de asemenea, o matrice este legat de faptul că toate matricile sunt obiecte speciale. Vă întrebați de ce Array.prototype este o matrice și nu un obiect obișnuit? Sau de ce prototipurile JS nu sunt restrânse să fie șiruri – > hărți funcționale? Sau de ce matricile JS sunt obiecte speciale? Sau altceva?
  • Probabil că ' puneți întrebarea greșită. Întrebarea corectă este " de ce nu ' t 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.
  • @Ixrec De ce Array.prototype este mai mult decât Object? Mai mult în sensul de a oferi facilități pentru stocarea elementelor.
  • @overexchange Dar obiectele stochează și elemente. Dacă vă referi la stocarea elementelor cu chei întregi, matricele nu <

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.

  • @Ixrec Dar nu toate obiectele au 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 valoare length. De ce ați plasa proprietatea length în Array.prototype? Ar avea sens să plasați length proprietate în funcția de constructor Array, la instanțiat, fiecare instanță va avea propriul length proprietate care semnifică lungimea matricei. Dar length proprietatea Array 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 proprietate length, acea length 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 fapt x.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.

  • De ce poate ' nu este un obiect obișnuit cu toate proprietățile cum ar fi push etc. implementate, astfel încât instanța Array să moștenească de la acesta?
  • Lasă un răspuns

    Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *