Summary: I denne tutorial lærer du, hvordan JavaScript prototypal inheritance fungerer.
Indledning til JavaScript prototypisk arv
Hvis du har arbejdet med andre objektorienterede programmeringssprog såsom Java eller C++, har du været bekendt med arvebegrebet.
I dette programmeringsparadigme er en klasse et blueprint til at skabe objekter. Hvis du ønsker, at en ny klasse skal genbruge funktionaliteten i en eksisterende klasse, kan du oprette en ny klasse, der udvider den eksisterende klasse. Dette kaldes klassisk arv.
JavaScript anvender ikke klassisk arv. I stedet bruger det prototypisk arv.
I prototypisk arv “arver” et objekt egenskaber fra et andet objekt via prototypeforbindelsen.
JavaScript prototypisk arv og __proto__
Lad os tage et eksempel for at gøre begrebet mere klart.
Det følgende definerer et person-objekt:
Code language: JavaScript (javascript)
Det person-objekt har to egenskaber:
-
nameder indeholder en strengværdi. -
greetder indeholder en værdi, der tilfældigvis er en funktion.greeter kendt som en metode forperson-objektet.
Som standard giver JavaScript dig en Object()-funktion og et prototypeobjekt, som du kan få adgang til via prototype-egenskaben for Object()-funktionen:

Når du bruger syntaksen for objektlitteratur til at definere et objekt, er objektet en instans af Object. Derfor returnerer udtrykket person instanceof Object true:
Code language: JavaScript (javascript)
Output:
Code language: JavaScript (javascript)
Objektet person er også forbundet med Object.prototype via ]-forbindelsen.
Med andre ord kan du få adgang til alle egenskaber i Object.prototype-objektet via person-objektet. Eksempelvis:
Code language: JavaScript (javascript)
Output:
Code language: JavaScript (javascript)
Den er standardkonverteringen fra et objekt til streng.
Når du kalder toString()-metoden på person-objektet, kan JavaScript ikke finde det. Så JavaScript følger prototypekæden og søger efter metoden på Object.prototype-objektet Object.prototype. JavaScript kan finde toString()-metoden på Object.prototype-objektet og udfører den.
For at få adgang til prototypen for person-objektet kan du bruge dets __proto__-egenskab:
Code language: JavaScript (javascript)
Output:
Code language: JavaScript (javascript)
Det følgende definerer et andet objekt kaldet teacher. teacher-objektet har teach()-metoden:

Hvis du ønsker, at teacher-objektet skal have adgang til alle egenskaberne i person-objektet, kan du indstille prototypen for teacher-objektet til person-objektet:
Code language: JavaScript (javascript)

Bemærk, at du aldrig bør bruge __proto__ i produktionskoden. Dette er kun til lærings- og forståelsesformål.
Nu kan teacher-objektet få adgang til name-egenskaben og greet()-metoden fra person-objektet via prototypekæden:
Code language: JavaScript (javascript)
Output:
Code language: JavaScript (javascript)
Når du kalder greet()-metoden på teacher-objektet, finder JavaScript den først på teacher-objektet.
Da JavaScript ikke kan finde metoden på teacher-objektet, følger det prototypekæden og søger efter metoden på person-objektet. Denne gang kan JavaScript finde metoden på person-objektet og udfører greet()-metoden.
I JavaScript siger vi, at teacher-objektet arver egenskaber fra person-objektet. Og det er prototypisk arv.
En standardmetode til at implementere prototypisk arv i ES5
ES5 gav en standardmetode til at arbejde med prototypisk arv ved at bruge Object.create()-metoden.
Bemærk, at du nu skal bruge de nyere ES6-keywords class og extends til at implementere arv. Det er meget enklere.
Metoden Object.create() opretter et nyt objekt og bruger et eksisterende objekt som prototype for det nye objekt:
Code language: JavaScript (javascript)
Metoden Object.create() accepterer to argumenter:
- Det første argument (
proto) er et objekt, der bruges som prototype for det nye objekt. - Det andet argument (
propertiesObject), hvis det er angivet, er et valgfrit objekt, der definerer yderligere egenskaber for det nye objekt.
Sæt, at du har et person-objekt:
Code language: JavaScript (javascript)
Det følgende opretter et tomt teacher-objekt med __proto__ af person-objektet:
Code language: JavaScript (javascript)
Derpå kan du definere egenskaber for teacher-objektet:
Code language: JavaScript (javascript)
Og du kan også udføre alle disse trin i én erklæring som følger:
Code language: JavaScript (javascript)
ES5 introducerede også Object.getPrototypeOf()-metoden, der returnerer prototypen for et objekt. For eksempel:
Code language: JavaScript (javascript)
Output:
Code language: JavaScript (javascript)
Summary
- Arv giver mulighed for, at et objekt kan bruge egenskaber og metoder fra et andet objekt.
- JavaScript anvender prototypisk arv, der opnås via prototype linkage.
- Var denne vejledning nyttig?
- JaNej