Alla olevassa visualisoinnissa
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
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.
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
lengthon ilmentymätason ominaisuus. Jokaisella taulukon esiintymällä on omalength-arvo. Miksi sijoitatlength-ominaisuuden kohtaanArray.prototype? Olisi järkevää sijoittaalength-ominaisuusArray-rakentajafunktioon, heti kun se on tehty, jokaisella instanssilla on omalength-ominaisuus, joka tarkoittaa taulukon pituutta. MuttaArray-rakentajafunktionlength-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ä
lengthon jaettu ominaisuus kaikkien matriisi-esiintymien välillä ja kuten heti kun instanssi muokkaa omaalengthominaisuuttaan, jaettulengthmuuttuu varjostetuksi ja siksi hyödyttömäksi (koska mikä tahansa aritmeettinen operaatio johtaa varjostukseen) esiintyy, esim.x.length++on itse asiassax.length = x.length + 1). Joten onko kyseisen ominaisuuden ainoa käyttö sinun mielestäsi niin, että kaikki matriisi-esiintymät saavat alkuominaisuudenlength? - Jokaisella taulukko-objektilla on
lengthominaisuus, joka ei ole millään tavalla johdettuArray.prototype.length-ominaisuudesta.Yritä vain asettaaArray.prototype[10] = 42, jolloinArray.prototype.lengthon 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,lengthei 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ä?
arrayei toimi täysin? " Ja mielestäni vastaus on itsestään selvä: samoista syistä, jotka jaoit luokan toiminnallisuuden abstraktiksi luokaksi ja luokaksi, joka perii se.Array.prototypeon enemmän kuinObject? Enemmän siinä mielessä, että tarjotaan mahdollisuus elementtien tallentamiseen.[42]on olennaisesti sama asia kuin{ "0": 42 }, mutta sillä on erilainen prototyyppi ja että funkylengthominaisuus.lengthominaisuutta, jota korotetaan jokaiselle objektiin tallennetulle ominaisuudelle. Tässä sanon, ettäArray.prototypeon täysin toimiva taulukko.