Klasių paveldėjimo pagal „JavaScript“ prototipų vadovas

Kompiuterinės kalbos dažnai suteikia galimybę paveldėti vieną objektą
kitas objektas. Paveldėtame objekte yra visos jo pirminio objekto savybės. Be to, jis taip pat nurodys savo unikalių savybių rinkinį.

Stebėkite mane „Twitter“, kad gautumėte „JavaScript“ patarimų ir knygų skelbimų.

„JavaScript“ objektams naudojamas paveldėjimas pagal prototipą. Jos dizainas logiškai panašus (tačiau skiriasi įgyvendinimu) nuo klasės paveldėjimo griežtai į objektus orientuoto programavimo kalbomis.

Tai galima lengvai apibūdinti sakydami, kad kai metodai ar savybės pridedami prie objekto prototipo, jie tampa prieinami naudoti tame objekte ir jo palikuoniuose. Tačiau šis procesas dažnai vyksta užkulisiuose.

Rašydami kodą, jums net nereikės tiesiogiai liesti prototipo ypatybės. Vykdydami padalijimo metodą, jūs jį vadintumėte tiesiog iš eilutės, pažodžiui: „labas“ .split („e“) arba iš kintamojo: string.split („,“);

Kai naudojate klasę ir išplečiate raktinius žodžius, „JavaScript“ vis tiek naudos paveldėjimą pagal prototipus. Tai tik supaprastina sintaksę. Galbūt todėl svarbu suprasti, kaip veikia paveldėjimas pagal prototipus. Tai vis dar yra kalbos dizaino pagrindas.

Štai kodėl daugelyje vadovėlių matysite parašytą „String.prototype.split“, o ne tiesiog „String.split“. Tai reiškia, kad yra metodo padalijimas, kurį galima naudoti su eilutės tipo objektais, nes jis pridedamas prie to objekto prototipo ypatybės.

Objektų tipų loginės hierarchijos kūrimas

Katė ir šuo yra paveldimos iš gyvūno, kuris paveldimas iš gyvūno.

Šuo ir katė turi panašius bruožus. Užuot sukūrę dvi skirtingas klases,
mes galime tiesiog sukurti vienos klasės augintinį ir iš jo paveldėti katę ir šunį. Bet pati „Pet“ klasė taip pat gali būti paveldima iš „Animal“ klasės.

Prieš pradėdami

Bandymas suprasti prototipus yra tarsi upės perplaukimas, pereinant nuo kodavimo iki kompiuterinės kalbos projektavimo. Dvi visiškai skirtingos žinių sritys.

Techniniu požiūriu programinės įrangos rašymui pakanka tik lengvų klasės žinių ir išplėstinių raktinių žodžių. Bandymas suprasti prototipą yra tarsi įsijautimas į tamsesnius kalbos dizaino kampus. O kartais tai gali būti įžvalgu.

Vien šios instrukcijos nepakaks. Aš susitelkiau tik į kai kuriuos svarbius dalykus, kurie, tikiuosi, nuves jus teisinga linkme.

Po gaubtu

Objekto paveldėjimo idėja yra sudaryti Hierarchijos struktūrą
panašūs objektai. Taip pat galite pasakyti, kad objektas vaikas yra „kilęs“ iš jo tėvų.

Kaip „JavaScript“ tinkle kuriamos prototipų grandinės.

Techniškai tai atrodo. Stenkitės per daug negalvoti apie tai. Tiesiog žinokite, kad pačiame hierarchijos viršuje yra objektas „Object“. Štai kodėl jo paties prototipas nurodo negaliojantį. Virš jo nėra nieko daugiau.

Objekto paveldėjimas pagal prototipus

„JavaScript“ palaiko objektų paveldėjimą per vadinamuosius prototipus. Prie kiekvieno objekto yra objekto ypatybė, vadinama prototipu.

Dirbti su klase ir pratęsti raktinius žodžius yra lengva, bet iš tikrųjų suprasti, kaip veikia paveldėjimas pagal prototipus, nėra nereikšminga. Tikimės, kad ši instrukcija pakels bent šiek tiek rūko!

Objekto konstruktoriaus funkcijos

Funkcijos gali būti naudojamos kaip objektų konstruktoriai. Konstruktoriaus funkcijos pavadinimas paprastai prasideda didžiosiomis raidėmis, kad būtų galima atskirti įprastas funkcijas. Objekto konstruktoriai naudojami kuriant objekto egzempliorių.

Kai kurie „JavaScript“ įmontuoti objektai jau buvo sukurti laikantis tų pačių taisyklių. Pavyzdžiui, skaičius, masyvas ir eilutė yra paveldimi iš objekto. Kaip jau aptarėme anksčiau, tai reiškia, kad bet kokia nuosavybė, pridedama prie objekto, tampa automatiškai prieinama visiems jo vaikams.

Konstruktoriai

Neįmanoma suprasti prototipo, nesuvokiant konstruktoriaus funkcijų anatomijos.

Taigi, kas tiksliai atsitinka, kai sukuriame pasirinktinio konstruktoriaus funkciją? Mūsų klasės apibrėžime stebuklingai atsiranda dvi savybės: konstruktorius ir konstruktoriaus prototipas.

Jie nenurodo to paties objekto. Padalinkime juos:

Tarkime, kad mes apibrėžiame naują klasės kraną (naudojant funkciją arba klasės raktinį žodį).

Ką tik sukurtas individualus konstruktorius dabar yra prijungtas prie mūsų pasirinktinės „Crane“ klasės savybių prototipų. Tai yra nuoroda, nurodanti jo paties konstruktorių. Tai sukuria apskrito logiką. Bet tai tik vienas galvosūkio gabalas.

Pažvelkime į „Crane.constructor“:

Pats „Crane.constructor“ nurodo objekto, iš kurio jis buvo sukurtas, tipą.
Kadangi visi objektų konstruktoriai yra natūraliųjų funkcijų, objektas Crane.constructor nurodo, kad yra Type tipo objektas, kitaip tariant, funkcijos konstruktorius.

Ši dinamika tarp „Crane.prototype.constructor“ ir „Crane.constructor“ yra tai, kas įgalina prototipo paveldėjimą molekuliniu lygmeniu. Rašydamas „JavaScript“ kodą, retai kada apie tai turite galvoti. Bet tai tikrai yra interviu klausimas.

Trumpai apžvelkime tai dar kartą. Kranas.prototipas.konstruktorius nurodo savo konstruktorių. Tai beveik kaip sakydamas „aš esu aš“.

Tas pats tikslus atsitinka, kai klasę apibrėžiate naudodami klasės raktinį žodį:

Tačiau „Crane.constructor“ savybė nurodo konstruktorių Funkcija.

Štai taip yra užmegztas ryšys.

Dabar pats krano objektas gali būti kito objekto „prototipas“. Ir tas objektas gali būti kito objekto prototipas. Ir taip toliau. Grandinė gali tęstis amžinai.

Šoninė pastaba: ES5 stiliaus funkcijų atveju pati funkcija yra
konstruktorius. Bet ES6 klasės raktinis žodis nurodo konstruktorių į jo taikymo sritį. Tai tik sintaksinis skirtumas.

Paveldėjimas pagal prototipus

Objektams kurti ir paveldėti visada turėtume naudoti klasę ir pratęsti raktinius žodžius. Bet jie yra tik saldainių įvynioklis tam, kas iš tikrųjų vyksta užkulisiuose.

Nors objektų paveldėjimo hierarchijų kūrimas naudojant ES5 stiliaus sintaksę yra jau seniai pasenęs ir retai pasitaikantis tarp profesionalių programinės įrangos kūrėjų, suprasdami ją, gausite gilesnį supratimą apie tai, kaip ji iš tikrųjų veikia.

Apibrėžkime naują objektą Paukštis ir pridėkime 3 savybes: tipą, spalvą ir kiaušinius. Taip pat pridėkime 3 metodus: skristi, vaikščioti ir gulėti. Tai, ką gali padaryti visi paukščiai:

Atminkite, kad aš sąmoningai pažymėjau „lay_egg“ metodą. Prisimeni, kaip mes
anksčiau aptarėme, kad „Bird.prototype“ nurodo į savo paties konstruktorių?

Kaip alternatyvų pavyzdį, galėjote alternatyviai prijungti kiaušinių dėjimo metodą tiesiogiai prie „Bird.prototype“:

Iš pirmo žvilgsnio gali atrodyti, kad nėra skirtumo tarp metodų, naudojamų naudojant šį raktinį žodį „Bird“, pridėjimo ir tiesiog pridėjimo tiesiogiai prie „Bird.prototype“ ypatybės. Nes vis tiek veikia teisingai?

Bet tai ne visai tiesa. Kol kas gilintis į detales negalėčiau, nes ne iki galo suprantu skirtumą čia. Tačiau planuoju atnaujinti šią mokymo programą, kai sukaupsiu daugiau įžvalgos šia tema.

(Veteranų prototipų komentarai laukiami!)

Ne visi paukščiai yra panašūs

Objekto paveldėjimo esmė yra naudoti vieną bendrą klasę, apibrėžiančią visas savybes ir metodus, kuriuos automatiškai paveldės visi tos klasės vaikai. Tai sutrumpina kodą ir taupo atmintį.

(Įsivaizduokite, kad apibrėžtumėte tas pačias savybes ir metodus visiems vaikams skirtiems objektams iš naujo. Tai užtruktų dvigubai daugiau atminties.)

Kurkime keletą skirtingų rūšių paukščių. Nepaisant to, kad visi jie vis dar gali skristi, vaikščioti ir gulėti kaip paukščiai (nes jie paveldėti iš pagrindinės paukščių klasės), kiekvienas unikalus paukščių tipas pridės savo metodus, būdingus tai klasei. Pavyzdžiui, kalbėti gali tik papūgos. Tik galvosūkiai gali išspręsti galvosūkius. Dainuoti gali tik dainelė.

Papūga
Sukurkime papūgą ir paveldėkime ją iš paukščio:

Papūga yra įprastinė konstruktoriaus funkcija, kaip ir Paukštis.

Skirtumas tas, kad mes vadiname „Bird“ konstruktoriumi su „Bird.call“ ir perduodame papūgos kontekstą prieš pritvirtindami savo metodus. „Bird.call“ tiesiog prideda visas savo savybes ir metodus „Parrot“. Be to, mes pridedame ir savo metodą: kalbėtis.

Dabar papūgos gali skristi, vaikščioti, dėti kiaušinius ir kalbėtis! Bet mes niekada neturėjome apibrėžti „fly Walking“ ir „lay_eggs“ metodų paties „Parrot“ viduje.

Varnas
Tuo pačiu būdu, sukurkime varną ir paveldėkime jį iš „Bird“:

Varnos yra unikalios tuo, kad gali spręsti galvosūkius.

Dainų paukštis
Dabar sukurkime „Songbird“ ir paveldėkime ją iš „Bird“:

Dainų paukščiai gali dainuoti.

Tikrinti paukščius

Tiesiog sukūrėme krūvą skirtingų paukščių, turinčių unikalių sugebėjimų. Pažiūrėkime ką
jie geba! Iki šiol mes tik apibrėžėme klases ir įkūrėme jas
hierarchinis santykis.

Norėdami dirbti su objektais, turime juos akimirksniu išpildyti:

Pabandykime žvirblį panaudoti originalų „Bird“ konstruktorių:

Žvirblis gali skristi, vaikščioti ir dėti kiaušinius, nes jis buvo paveldėtas iš paukščio, kuris apibūdina visus tuos metodus.

Bet žvirblis negali kalbėti. Nes tai nėra papūga.

Sukurkime papūgą iš papūgos klasės:

Kadangi papūga yra paveldėta iš paukščio, mes gauname visus jo metodus. Papūga turi unikalų sugebėjimą susikalbėti, tačiau ji negali dainuoti! Dainavimo būdas galimas tik „Songbird“ tipo objektuose. Paveldėkime Starling iš „Songbird“ klasės:

Galiausiai sukurkime varną ir išspręsime keletą galvosūkių:

Klasės naudojimas ir pratęsia raktinius žodžius

ES5 stiliaus konstruktoriai gali būti šiek tiek nepatogūs.

Laimei, dabar turime klasę ir plečiame raktinius žodžius, kad atliktume lygiai tą patį, ką darėme ankstesniame skyriuje.

klasė pakeičia funkciją

išplečia ir super () pakeičia „Bird.call“ iš ankstesnių pavyzdžių.

Atminkite, kad turime naudoti super (), kuris vadina pagrindinės klasės konstruktoriumi.

Ši sintaksė atrodo daug lengviau valdoma!

Dabar viskas, ką turime padaryti, yra objekto pagreitinimas:

Apžvalga

Klasės palikimas padeda nustatyti objektų hierarchiją.

Klasės yra pagrindiniai jūsų programos projektavimo ir architektūros elementai. Jie daro darbą su kodu šiek tiek žmogiškesnį.

Žinoma, Paukštis buvo tik pavyzdys. Realiame scenarijuje tai gali būti bet kas, atsižvelgiant į tai, kokią programą bandote sukurti.

Transporto priemonių klasė gali būti motociklo, automobilio ar autocisternos pradinė dalis.

Žuvis gali būti naudojama paveldėti ryklį, auksinę žuvelę, lydeką ir pan.

Paveldimumas padeda mums rašyti švaresnį kodą ir panaudoti pagrindinį objektą, kad būtų išsaugota atmintis kartojant objekto ypatybes ir metodo apibrėžimus.