JavaScript-bruker prototypal arv: hver gjenstand arver egenskaper og metoder fra dens prototype objekt.

tradisjonell klasse som blåkopi for å opprette objekter, som brukes i språk som Java eller Swift, eksisterer ikke i JavaScript. Den prototypal arv tilbud bare med objekter.

prototypal arv kan emulere den klassiske klasse arv. For å bringe den tradisjonelle klasser til JavaScript, ES2015 standard introduserer class syntaks: en syntaktisk sukker over prototypal arv.,

Dette innlegget du kjent med JavaScript klasser: hvordan definere en klasse, må du initialisere det eksempel definere felter og metoder, forstå private og offentlige felt, bør du holde i den statiske felt og metoder.

1. Definisjon: klasse søkeord

De spesielle søkeord class definerer en klasse i JavaScript:

class User { // The body of class}

koden ovenfor definerer en klasse User. Den krøllparentes { } avgrense klassen kroppen. Merk at denne syntaksen er oppkalt klasse erklæring.,

Du er ikke forpliktet til å indikere klasse navn. Ved hjelp av en klasse uttrykk du kan tilordne klasse til en variabel:

const UserClass = class { // The body of class};

Du kan enkelt eksportere en klasse som en del av en ES2015 modul. Her er syntaksen for en standard eksport:

export default class User { // The body of class}

Og en navngitt eksport:

export class User { // The body of class}

klassen blir nyttig når du oppretter en instans av klassen. Et eksempel er et objekt som inneholder data og oppførsel beskrevet av klassen.,

new operatør instantiates klassen i JavaScript: instance = new Class().

For eksempel, du kan instantiate User klassen ved hjelp av new bruker:

const myUser = new User();

new User() oppretter en instans av User klasse.

2. Initialisering: constructor()

constructor(param1, param2, ...) er en spesiell metode i kroppen av en klasse som initialiserer eksempel., Det er stedet der du kan angi de opprinnelige verdiene for feltene, eller gjøre noe som helst slags objekt oppsett.

I det følgende eksemplet konstruktøren setter den første verdien i feltet name:

class User { constructor(name) { this.name = name; }}

User‘s constructor har én parameter name, som er brukt for å angi den første verdien i feltet this.name.

Inne i konstruktøren this verdi er lik den nyopprettede eksempel.,

De argumentene som er brukt for å instantiate klassen blir parametrene i konstruktøren:

class User { constructor(name) { name; // => 'Jon Snow' this.name = name; }}const user = new User('Jon Snow');

name parameter inne i konstruktøren har verdi 'Jon Snow'.

Hvis du ikke definere en konstruktør for klassen, en standard og en er opprettet. Standard konstruktør er en tom funksjon, som ikke endre forekomsten.

På samme tid, en JavaScript-klasse kan ha opp til en konstruktør.

3. Felt

Klasse felt er variabler som holder informasjon., Felt kan knyttes til 2 enheter:

  1. Felt på klasse forekomst
  2. Felt på klasse i seg selv (også kjent som statisk)

feltene har også 2 nivåer for tilgjengelighet:

  1. Offentlig: feltet er tilgjengelig hvor som helst
  2. Privat: feltet er bare tilgjengelig i kroppen av klasse

3.1 Offentlige eksempel felt

La oss igjen se på den forrige kodebit:

class User { constructor(name) { this.name = name; }}

uttrykket this.name = name oppretter en forekomst feltet name og gir det en startverdi.,

Senere kan du få tilgang name – feltet ved hjelp av en eiendel accessor:

const user = new User('Jon Snow');user.name; // => 'Jon Snow'

name er en offentlig feltet fordi du kan få tilgang til den utsiden av User klasse kroppen.

Når feltene er opprettet implisitt inne i konstruktøren, som i forrige scenario, kan det være vanskelig å ta tak i felt-listen. Du har å holde styr på dem fra constructor kode.

En bedre tilnærming er å uttrykkelig erklærer klassen felt., Uansett hva konstruktøren gjør, forekomst alltid har de samme feltene.

klassen felt forslaget lar deg definere feltene inne i kroppen av klassen. Plus, kan du angi startverdi med en gang:

class SomeClass { field1; field2 = 'Initial value'; // ...}

La oss endre User klasse og erklære en offentlig feltet name:

class User { name; constructor(name) { this.name = name; }}const user = new User('Jon Snow');user.name; // => 'Jon Snow'

name; inne i kroppen av klasse erklærer en offentlig feltet name.,

Den offentlige felt erklært en slik måte at det er uttrykksfulle: en rask titt på feltene erklæringer er nok til å forstå class data struktur.

Videre, klasse-feltet kan være initialisert med en gang ved erklæring.

class User { name = 'Unknown'; constructor() { // No initialization }}const user = new User();user.name; // => 'Unknown'

name = 'Unknown' i klasse kroppen erklærer et felt name og initialiseres det med verdi 'Unknown'.

Det er ingen begrensning på tilgang eller oppdatering av offentlige felt., Du kan lese og tilordne verdier til offentlige felt inne i konstruktøren, metoder og utenfor klassen.

3.2 Privat eksempel felt

Innkapsling er et viktig konsept som gjør at du kan skjule interne detaljer for en klasse. Noen som bruker en innkapslet klasse avhenger kun på de offentlige grensesnitt som klassen gir, og ikke par til gjennomføring detaljer av klassen.

Klasser organisert med innkapsling i tankene er enklere å oppdatere når gjennomføringen detaljene du vil endre.,

En god måte å skjule interne data på et objekt på, er å bruke eget felt. Dette er feltene som kan leses og endres bare innen den klasse de tilhører. Verden utenfor klassen kan ikke endre eget felt direkte.

Den private felt er kun tilgjengelig i kroppen av klassen.

Prefiks feltet navn med den spesielle symbol # for å gjøre det privat, f.eks. #myField., Prefikset # må holdes hver gang du arbeider med felt: erklære den, les den, eller endre det.

La oss sørge for at feltet #name kan settes i gang på initiativ initialisering:

#name er et eget felt. Du kan få tilgang til og endre #name i kroppen av User. Metoden getName() (mer om metoder i neste avsnitt) kan få tilgang til den private felt #name.,

Men hvis du prøver å få tilgang til den private felt #name utsiden av User klasse kroppen, en syntaks-feil er kastet: SyntaxError: Private field '#name' must be declared in an enclosing class.

3.3 Offentlige statiske felt

Du kan også angi felt på klasse i seg selv: den statiske felt. Dette er nyttig for å definere klasse konstanter eller lagre informasjon som er spesifikk for klassen.

for Å lage statiske felt i en JavaScript-klasse, kan du bruke spesielle søkeord static etterfulgt av feltet navn: static myStaticField.,

La oss legge til et nytt felt type indikerer at brukeren skriver: admin eller regelmessig. Den statiske felt TYPE_ADMIN og TYPE_REGULAR er nyttige konstanter for å skille mellom brukeren typer:

static TYPE_ADMIN og static TYPE_REGULAR angi statisk variabler inne i User klasse. For å få tilgang til den statiske felt, må du bruke klassen etterfulgt av feltet navn: User.TYPE_ADMIN og User.TYPE_REGULAR.

3.,4 Private statiske felt

noen Ganger selv de statiske felt er en implementering detaljer som du ønsker å skjule. I denne forbindelse, kan du gjøre statiske felt private.

for Å gjøre den statiske felt private, prefiks feltet navn med # spesielle symboler: static #myPrivateStaticField.

La oss si at du ønsker å begrense antallet forekomster av User klasse., For å skjule detaljer om forekomster grenser, kan du opprette egen statiske felt:

Den statiske felt User.#MAX_INSTANCES angir maksimalt antall tillatte forekomster, mens User.#instances statisk felt teller faktisk antall tilfeller.

Disse private statiske felt er kun tilgjengelig i User klasse. Ingenting fra den ytre verden kan forstyrre grenser mekanisme: det er fordel for innkapsling.

4. Metoder

feltene holde data., Men evnen til å endre data er utført av spesielle funksjoner som er en del av klassen: de metoder.

JavaScript-klasser støtte både forekomst og statiske metoder.

4.1 Forekomst metoder

Eksempel metoder kan få tilgang til og endre eksempel data. Eksempel metoder kan ringe andre forekomsten metoder, samt eventuell statisk metode.,

For eksempel, la oss definere en metode getName() som returnerer navnet i User class:

I en klasse metode, så vel som i constructor, this verdi tilsvarer klasse forekomst. Bruk this for å få tilgang til forekomst av data: this.field, eller du kan selv ringe til andre metoder: this.method().,

La oss legge til en ny metode nameContains(str) som har én parameter, og kaller opp en annen metode:

nameContains(str) { ... } er en metode for User klasse som aksepterer en parameter str. Mer enn det, det kjører en annen metode for eksempel this.getName() for å få brukernavnet.

En metode kan også være private. For å gjøre metoden eget prefiks sitt navn med #.

La oss gjøre getName() metode privat:

#getName() er en egen metode., Inne i metoden nameContains(str) du ringer til en egen metode slik måte: this.#getName().

å Være privat, #getName() kan ikke bli kalt utenfor User klasse kroppen.

4.2 Getters og bidra

getter og setter etterligner vanlig feltet, men med mer kontroll på hvordan feltet er åpnet og endret.

getter er utført på et forsøk på å få felt verdi, mens du setter på et forsøk på å angi en verdi.,

for Å være sikker på at name egenskap av User kan ikke være tomt, la oss bryte det private feltet #nameValue i en getter og setter:

get name() {...} getter utføres når du tilgang verdien for feltet: user.name.

4.3 Statiske metoder

Den statiske metoder er funksjoner som er koblet direkte til klassen. De holder logikk knyttet til klasse, snarere enn til forekomst av klassen.,

for Å lage en statisk metode bruk den spesielle søkeord static etterfulgt av en vanlig metode syntaks: static myStaticMethod() { ... }.

Når du arbeider med statiske metoder, det er 2 enkle regler å huske på:

  1. En statisk metode kan få tilgang til statiske felt
  2. En statisk metode ikke tilgang til forekomst felt.

For eksempel, la oss lage en statisk metode som oppdager om en bruker med et bestemt navn allerede var tatt.,

isNameTaken() er en statisk metode som bruker den statiske eget felt User.#takenNames for å sjekke tatt navn.

5. Arv: forlenger

klassene i JavaScript-støtte, enkel arv ved å bruke extends søkeord.

I uttrykket class Child extends Parent { } Child klassen arver fra Parent konstruktøren, felt og metoder.

For eksempel, la oss lage et nytt barn klasse ContentWriter som strekker overordnet klasse User.,

ContentWriter arver fra User konstruktøren, metoden getName() og feltet name. Så vel, ContentWriter klasse erklærer en ny feltet posts.

Merk som privat medlemmer av en forelder klasse er ikke arvet av barnet klasse.

5.1 Overordnede konstruktør: super() i constructor()

Hvis du ønsker å ringe foreldrene konstruktør et barn klasse, må du bruke super() spesielle funksjonen tilgjengelig i barnet constructor.,

For eksempel, la oss gjøre ContentWriter constructor ringe foreldrene konstruktør av User, så vel som initialisere innlegg feltet:

super(name) i barnet klassen ContentWriter utfører konstruktøren av den overordnede klasse User.

Merk at inni barnet konstruktøren må du kjøre super() før du bruker this søkeord. Ringer super() sørger for at den overordnede constructor initialiserer eksempel.,

class Child extends Parent { constructor(value1, value2) { // Does not work! this.prop2 = value2; super(value1); }}

5.2 Overordnet instans: super i metoder

Hvis du ønsker å få tilgang til den overordnede metoden innsiden av et barn som metode, kan du bruke spesielle snarvei super.

getName() av barnet klassen ContentWriter tilgang metoden super.getName() direkte fra den overordnede klasse User.

Denne funksjonen kalles metoden overordnede.

Merk at du kan bruke super med statiske metoder for å få tilgang til foreldrenes statiske metoder.

6., Object type checking: instanceof

object instanceof Class is the operator that determines if object is an instance of Class.

Let’s see instanceof operator in action:

user is an instance of User class, user instanceof User evaluates to true.

The empty object {} is not an instance of User, correspondingly obj instanceof User is false.,

instanceof er polymorf: operatør oppdager et barn som en forekomst av den overordnede klasse.

writer er en forekomst av barnet klassen ContentWriter. Operatøren writer instanceof ContentWriter beregner true.

På samme tid ContentWriter er et barn klasse av User. Så writer instanceof User beregner true så godt.

Hva hvis du ønsker å finne ut den nøyaktige klasse for eksempel?, Du kan bruke constructor eiendom og sammenligne direkte med klassen:

writer.constructor === ContentWriter; // => truewriter.constructor === User; // => false

7. Klasser og prototyper

jeg må si at klassen syntaks i JavaScript gjør en god jobb til abstrakt fra prototypal arv. For å beskrive class syntaks jeg har ikke selv brukt begrepet prototype.

Men klassene er bygget på toppen av prototypal arv. Hver klasse er en funksjon, og skaper en forekomst når påberopt som en konstruktør.

følgende to kodebiter er tilsvarende.,

klassen versjon:

Den versjonen du bruker prototype:

klassen syntaks er langt enklere å jobbe hvis du er kjent med den klassiske arv mekanisme av Java eller Swift-språk.

Anyways, selv om du bruker klasse syntaks i JavaScript, anbefaler jeg deg å ha en god forståelse av prototypal arv.

8. Klasse funksjoner tilgjengelighet

klassen har presentert i dette innlegget er spredt over ES2015 og forslag på trinn 3.,

Ved utgangen av 2019, klasse funksjoner er delt mellom:

  • Offentlig og privat eksempel feltene er en del av Klassen felt forslaget
  • Privat eksempel metoder og accessors er en del av Klassen privat metoder forslaget
  • Offentlig og privat statiske felt og private static metoder er en del av Klassen statiske funksjoner forslaget
  • resten er en del av ES2015 standard.

9. Konklusjon

JavaScript-klasser initialisere tilfeller med konstruktører, definere felter og metoder., Du kan legge ved felter og metoder selv om klassen selv ved hjelp av static søkeord.

Arv oppnås ved bruk av extends søkeord: du kan enkelt lage et barn klasse fra en forelder. super søkeord brukes til å få tilgang til den overordnede klasse fra et barn klasse.

for Å dra nytte av innkapsling, kontroller feltene og metoder privat for å skjule interne detaljer av klasser. Eget felt og metoder navn må begynne med #.,

klassene i JavaScript bli mer og mer praktisk å bruke.

Hva tror du om å bruke # for å prefiks private eiendommer?