Objektorientert JavaScript (OOJS) 3 måter å opprette objekter på
Når et programmeringsspråk er alt om objekter, Det første vi trenger å lære er hvordan lage objekter. Å lage objekter i JavaScript er ganske enkelt: et par krøllete braces vil gjøre jobben, det er det verken den eneste måten å opprette et objekt heller ikke den eneste måten du trenger å bruke.
I JavaScript er objektet forekomster laget av innebygde objekter og kommer til eksistens når programmet kjører. For eksempel, Dato
er et innebygd objekt som gir oss informasjon om datoer. Hvis vi vil vise gjeldende dato på en side, vi trenger en runtime forekomst av Dato
som bærer informasjonen om gjeldende dato.
JavaScript tillater oss også å definer våre egne objekter som kan produsere sine egne objektfelter i kjøretid. I JavaScript, alt er et objekt og hvert objekt har en ultimate forfader kalt Gjenstand
. Opprettelsen av en objekt-forekomst kalles oppretting.
1. Den ny
operatør
En av de vanligste og mest kjente metodene for å opprette en ny objektinstans er at bruker ny
operatør.
Du trenger en konstruktør å lage ny
operatør arbeid. En konstruktør er en metode for et objekt som setter sammen a ny forekomst av objektet. Den grunnleggende syntaksen ser slik ut:
ny konstruktør ()
En konstruktør kan godta argumenter som kan brukes til å endre eller legge til egenskaper til objektet instansen det konstruerer. Konstruktøren har samme navn som objektet den tilhører.
Her er et eksempel på hvordan du oppretter en forekomst av Dato()
gjenstand med ny
søkeord:
dt = ny dato (2017, 0, 1) console.log (dt) // søndag jan 01 2017 00:00:00 GMT + 0100
Dato()
er konstruktøren å lage en ny Dato
gjenstand. Ulike konstruktører for en gjenstand ta forskjellige argumenter å opprette samme type objekter med varierte attributter.
Ikke alle innebygde objekter i JavaScript kan bli instantiated som Dato
. Det er objekter som Ikke kom med en konstruktør: Matte
, JSON
og Reflektere
, men de er fortsatt vanlige gjenstander.
Blant de innebygde objekter som har konstruktør (er), symbol
kan ikke kalles i konstruktørstilen å instansere en ny symbol
forekomst. Det kan bare være kalt som en funksjon som returnerer en ny symbol
verdi.
Også, blant de innebygde objekter som har konstruktør (er), trenger ikke alle sine konstruktører å bli kalt med ny
operatør for å bli instantiated. Funksjon
, Array
, Feil
, og RegExp
kan også kalles som funksjoner, uten å bruke ny
søkeord, og de vil instantiere og returnere en ny objekteksempel.
2. Den Reflektere
gjenstand
Backend programmerere kan allerede være kjent med Refleksjon APIer. Refleksjon er en funksjon av programmeringsspråk til inspisere og oppdatere noen av de grunnleggende enhetene, for eksempel objekter og klasser, på kjøretid.
I JavaScript kan du allerede utføre noen refleksjon operasjoner bruker Gjenstand
. Men, a riktig refleksjon API til slutt kom til å eksistere i JavaScript også.
De Reflektere
objektet har et sett med metoder til opprett og oppdatere objektinstanser. De Reflektere
gjenstand har ingen konstruktør, så det kan ikke bli instantiated med ny
operatør, og akkurat som Matte
og JSON
, den kan ikke kalles som en funksjon enten.
derimot, Reflektere
har en ekvivalent av ny
operatør: den Reflect.construct ()
metode.
Reflect.construct (mål, argumenterListe [, newTarget])
Begge mål
og valgfritt NEWTARGET
Argumenter er gjenstander som har sine egne konstruktører, samtidig som argumentsList
er en liste over argumenter å bli sendt til konstruktøren av mål
.
var dt = Reflect.construct (Dato, [2017, 0, 1]); console.log (dt); // søndag 01 jan 2017 00:00:00 GMT + 0100
Koden ovenfor har samme effekt som instantiating Dato()
bruker ny
operatør. Selv om du fortsatt kan bruke ny
, Refleksjon er en ECMAScript 6 standard. Det lar deg også gjøre bruk av NEWTARGET
argument, som er en annen fordel i forhold til ny
operatør.
Verdien av NEWTARGET
prototype (for å være nøyaktig, det er prototypen til NEWTARGET
konstruktør) blir prototypen av den nyopprettede forekomsten.
En prototype er eiendom av et objekt, verdien av denne er også et objekt, bære egenskapene til det opprinnelige objektet. Kort sagt, et objekt får sine medlemmer fra prototypen.
Her ser vi et eksempel:
klasse A constructor () this.message = function () console.log ('melding fra A') klasse B constructor () melding () console.log ('melding fra B') data () console.log ('data fra B') obj = Reflect.construct (A, [], B) console.log (obj.message ()); // melding fra en console.log (obj.data ()); // data fra B console.log (obj instanceof B) // true
Ved å passere B
som det tredje argumentet til Reflect.construct ()
, prototypen verdien av obj
objektet er laget for å være det samme som prototype av B
Konstruktør (som har egenskapene budskap
og data
).
Og dermed, obj
kan få tilgang til budskap
og data
, tilgjengelig på prototypen. Men siden obj
er laget ved hjelp av EN
, den har også sin egen budskap
den mottat fra EN
.
Selv om obj
er konstruert som en matrise, det er det ikke en forekomst av Array
, fordi prototypen er satt til Gjenstand
.
obj = Reflect.construct (Array, [1,2,3], Object) console.log (obj) // Array [1, 2, 3] console.log (obj instanceof Array) // false
Reflect.construct ()
kan være nyttig når du vil opprette et objekt bruker mer enn ett blåkopi.
3. Den Object.create ()
metode
Du kan også opprette en nytt vanlig objekt med en bestemt prototype via Object.create ()
. Dette kan også virke svært likt å bruke ny
operatør, men det er det ikke.
Object.create (O [, propertiesObject])
De O
argument er et objekt som serverer prototypen for det nye objektet som skal opprettes. Den valgfrie propertiesObject
argumentet er a liste over eiendommer Du vil kanskje legge til det nye objektet.
klasse A konstruktør () melding () console.log ('melding fra A') var obj = Object.create (nytt A (), data: skrivbar: sann, konfigurerbar: sann, verdi: funksjon () (retur) data fra obj ')) console.log (obj.message ()) // melding fra A console.log (obj.data ()) // data fra obj obj1 = Object.create ( ny A (), foo: skrivbar: sant, konfigurerbar: sann, verdi: funksjon () retur 'foo fra obj1')) console.log (obj1.message ()) // melding fra En konsoll. logg (obj1.foo ()) // foo fra obj1
I obj
objekt, den ekstra egenskapen er data
, mens i obj1
, det er foo
. Så, som du ser, kan vi ha egenskaper og metoder lagt til i et nytt objekt.
Dette er flott når du vil opprette flere objekter av samme type men med forskjellige tilleggsegenskaper eller metoder. De Object.create ()
syntaks sparer bryet med å kode dem alle separat.