Miksi Array.prototype on suunniteltu olemaan täysin toimiva taulukko?

Alla olevassa visualisoinnissa

kirjoita kuvan kuvaus tähän

Matriisiobjekteja on kaksi (cars & bikes), jotka on luotu syntaksin alapuolella,

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

joiden [[Class]] ominaisuuden arvo on Array.

Lisäksi meillä on myös Array.prototype, joka on täysin toimiva taulukko, kuten näkyy alla,

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

Yleensä, kun laitat jotain prototype -kenttään, objektin jokainen esiintymä jakaa samat ominaisuudet.

Kysymys:

Kun length -ominaisuus on jäsen, Mikä on Array.prototype on täysin toimiva taulukko?

Kommentit

  • Ymmärrän, että < objekti > .pr ototyyppi on aina objekti, koska prototyypin koko asia on se, että se ' on kartta menetelmien nimistä todellisiin menetelmiin, jotka jakavat useat eri objektit. Se, että Array.prototype on myös taulukko, liittyy siihen, että kaikki matriisit ovat erikoiskohteita. Kysytkö miksi Array.prototype on matriisi eikä tavallinen esine? Tai miksi JS-prototyyppejä ei ole rajoitettu merkkijonoon – > -funktiokartat? Tai miksi JS-matriisit ovat erikoiskohteita? Tai jotain muuta?
  • Sinä ' kysyt todennäköisesti väärän kysymyksen. Oikea kysymys on " miksi ' t array ei toimi täysin? " Ja mielestäni vastaus on itsestään selvä: samoista syistä, jotka jaoit luokan toiminnallisuuden abstraktiksi luokaksi ja luokaksi, joka perii se.
  • @Ixrec Miksi Array.prototype on enemmän kuin Object? Enemmän siinä mielessä, että tarjotaan mahdollisuus elementtien tallentamiseen.
  • @overexchange Mutta esineet tallentavat myös elementtejä. Jos tarkoitat elementtien tallentamista kokonaislukuavaimilla, matriisit eivät tee sitäkään, koska matriisit ovat objekteja. Kokonaislukuavaimet muunnetaan aina merkkijonoiksi (koska Javascript on vähän outo). [42] on olennaisesti sama asia kuin { "0": 42 }, mutta sillä on erilainen prototyyppi ja että funky length ominaisuus.
  • @Ixrec Mutta kaikilla kohteilla ei ole length ominaisuutta, jota korotetaan jokaiselle objektiin tallennetulle ominaisuudelle. Tässä sanon, että Array.prototype on täysin toimiva taulukko.

Vastaa

Array-prototyyppi on itsessään täysin toimiva taulukko, koska sen on sisällettävä kaikki toiminnot, jotka ovat tarpeen objektin toimimiseksi matriisina. Array-esiintymät perivät kaiken toiminnallisuutensa prototyypin kautta.

-ominaisuuden mukaan :

Array-prototyyppi-objekti on itse taulukko; sen [[luokka]] on ”Taulukko”, ja sillä on pituusominaisuus (jonka alkuperäinen arvo on +0) ja erityinen [[DefineOwnProperty]] sisäinen menetelmä, joka on kuvattu kohdassa 15.4.5.1.

kommentit

  • Mutta ominaisuus length on ilmentymätason ominaisuus. Jokaisella taulukon esiintymällä on oma length -arvo. Miksi sijoitat length -ominaisuuden kohtaan Array.prototype? Olisi järkevää sijoittaa length -ominaisuus Array -rakentajafunktioon, heti kun se on tehty, jokaisella instanssilla on oma length -ominaisuus, joka tarkoittaa taulukon pituutta. Mutta Array -rakentajafunktion length -ominaisuus merkitsee konstruktoritoiminnon odottamien argumenttien määrää
  • @overexchange: Objektit ei peri ominaisuuksia rakentajalta, vain prototyypiltä. Siksi Array.lengthilla ei ole yhteyttä Array.prototype.lengthiin.
  • @JacquesB Tämä tarkoittaa, että length on jaettu ominaisuus kaikkien matriisi-esiintymien välillä ja kuten heti kun instanssi muokkaa omaa length ominaisuuttaan, jaettu length muuttuu varjostetuksi ja siksi hyödyttömäksi (koska mikä tahansa aritmeettinen operaatio johtaa varjostukseen) esiintyy, esim. x.length++ on itse asiassa x.length = x.length + 1). Joten onko kyseisen ominaisuuden ainoa käyttö sinun mielestäsi niin, että kaikki matriisi-esiintymät saavat alkuominaisuuden length?
  • Jokaisella taulukko-objektilla on length ominaisuus, joka ei ole millään tavalla johdettu Array.prototype.length -ominaisuudesta.Yritä vain asettaa Array.prototype[10] = 42, jolloin Array.prototype.length on yhtä suuri kuin 11, mutta tietysti uudet taulut eivät poimi tätä. He perivät elementin – kokeile [][10]. Tuskin toivottava käytös. Mistä tahansa syystä Array.prototype voi olla taulukko, length ei ole mitään tekemistä sen kanssa.
  • Miksi ' eikö se ole tavallinen objekti, jolla on kaikki ominaisuudet, kuten push jne., toteutettu, joten Array-ilmentymä perii siitä?

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *