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
length
on 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ä
length
on jaettu ominaisuus kaikkien matriisi-esiintymien välillä ja kuten heti kun instanssi muokkaa omaalength
ominaisuuttaan, jaettulength
muuttuu 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
length
ominaisuus, joka ei ole millään tavalla johdettuArray.prototype.length
-ominaisuudesta.Yritä vain asettaaArray.prototype[10] = 42
, jolloinArray.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ä?
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.Array.prototype
on 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ä funkylength
ominaisuus.length
ominaisuutta, jota korotetaan jokaiselle objektiin tallennetulle ominaisuudelle. Tässä sanon, ettäArray.prototype
on täysin toimiva taulukko.