Objektorienteret JavaScript (OOJS) 3 måder at oprette objekttilfælde på
Når et programmeringssprog er alt om objekter, Det første vi skal lære er hvordan man opretter objekter. Oprettelse af objekter i JavaScript er ret let: et par krøllede seler vil gøre jobbet, dog det er hverken den eneste måde at oprette et objekt heller ikke den eneste måde du bliver nogensinde nødt til at bruge.
I JavaScript er objektet forekomster oprettet fra indbyggede objekter og kommer til eksistens, når programmet kører. For eksempel, Dato
er et indbygget objekt, der giver os oplysninger om datoer. Hvis vi vil vise den aktuelle dato på en side, vi har brug for en runtime forekomst af Dato
der bærer oplysninger om den aktuelle dato.
JavaScript tillader os også at definer vores egne objekter der kan producere deres egne objektfelter i runtime. I JavaScript, alt er et objekt og hvert objekt har en ultimative forfader hedder Objekt
. Oprettelsen af et objekt eksempel kaldes instantiering.
1. Den ny
operatør
En af de mest almindelige og velkendte metoder til at oprette et nyt objekt eksempel er ved bruger ny
operatør.
Du har brug for en konstruktør at lave ny
operatør arbejde. En konstruktør er en metode til et objekt, der sætter sammen en ny forekomst af objektet. Dens grundlæggende syntaks ser ud som dette:
ny konstruktør ()
En konstruktør kan acceptere argumenter som kan bruges til at ændre eller tilføje egenskaber til objektets instans, som det konstruerer. Konstruktøren har samme navn som objektet det tilhører.
Her er et eksempel på, hvordan man opretter en eksempel på Dato()
objekt med ny
søgeord:
dt = ny dato (2017, 0, 1) console.log (dt) // søndag jan 01 2017 00:00:00 GMT + 0100
Dato()
er konstruktøren at skabe en ny Dato
objekt. Forskellige konstruktorer til en genstand tage forskellige argumenter at skabe de samme slags objekter med varierede attributter.
Ikke alle indbyggede objekter i JavaScript kan være instantiated som Dato
. Der er objekter der kom ikke med en konstruktør: Math
, JSON
og Afspejle
, men de er stadig almindelige genstande.
Blandt de indbyggede objekter, der har konstruktør (er), Symbol
kan ikke kaldes i konstruktørstilen at instantiere en ny Symbol
instans. Det kan kun være kaldet som en funktion som returnerer en ny Symbol
værdi.
Også blandt de indbyggede objekter, der har konstruktør (er), behøver ikke alle deres konstruktører at blive kaldt med ny
operatør for at blive instantiated. Fungere
, Array
, Fejl
, og RegExp
kan også kaldes som funktioner, uden at bruge ny
søgeord, og de vil instantiere og returnere en ny objekt instans.
2. Den Afspejle
objekt
Backend programmører kan allerede være bekendt med Refleksions-API'er. Refleksion er en funktion af programmeringssprog til inspicere og opdatere nogle af de grundlæggende enheder, såsom objekter og klasser, på kørselstidspunktet.
I JavaScript kan du allerede udføre nogle refleksionsoperationer ved hjælp af Objekt
. Men a korrekt refleksions-API til sidst kom til at eksistere i JavaScript også.
Det Afspejle
objekt har et sæt metoder til oprette og opdatere objektet forekomster. Det Afspejle
objekt har ingen konstruktør, så det kan ikke instantieres med ny
operatør, og ligesom Math
og JSON
, det kan ikke kaldes som en funktion enten.
Imidlertid, Afspejle
har en svarende til ny
operatør: det Reflect.construct ()
metode.
Reflect.construct (target, argumentsList [, newTarget])
Både mål
og det valgfrie NEWTARGET
argumenter er genstande der har deres egne konstruktører, mens argumentsList
er en liste over argumenter at blive overført til konstruktøren af mål
.
var dt = Reflect.construct (Dato, [2017, 0, 1]); console.log (dt); // sø Jan 01 2017 00:00:00 GMT + 0100
Koden ovenfor har samme virkning som instantiating Dato()
bruger ny
operatør. Selvom du stadig kan bruge ny
, Refleksion er en ECMAScript 6 standard. Det giver dig også mulighed for gøre brug af NEWTARGET
argument, hvilket er en anden fordel i forhold til ny
operatør.
Værdien af NEWTARGET
prototype (for at være præcis, det er prototypen af NEWTARGET
konstruktør) bliver prototypen af den nyoprettede instans.
En prototype er ejendom af et objekt, hvis værdi er også et objekt, bære egenskaberne af det oprindelige objekt. Kort sagt, et objekt får sine medlemmer fra sin prototype.
Lad os se et eksempel her:
klasse A constructor () this.message = function () console.log ('besked fra A') klasse B constructor () besked () console.log ('meddelelse fra B') data () console.log ('data fra B') obj = Reflect.construct (A, [], B) console.log (obj.message ()); // besked fra en konsol.log (obj.data ()); // data fra B console.log (obj instanceof B) // true
Ved at passere B
som det tredje argument til Reflect.construct ()
, prototypeværdien af obj
objekt er gjort for at være ens som prototype af B
Konstruktør (som har egenskaberne besked
og data
).
Dermed, obj
kan få adgang til besked
og data
, tilgængelig på sin prototype. Men siden obj
er lavet ved hjælp af EN
, den har også sin egen besked
det modtaget af EN
.
Selv om obj
er konstrueret som et array, det er ikke en forekomst af Array
, fordi dens prototype er indstillet til Objekt
.
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 nyttigt, når du vil oprette et objekt bruger mere end en blueprint.
3. Den Object.create ()
metode
Du kan også oprette en nyt almindeligt objekt med en specifik prototype via Object.create ()
. Dette kan også synes meget ligner at bruge ny
operatør, men det er det ikke.
Object.create (O [, propertiesObject])
Det O
argument er et objekt, der tjener prototypen for det nye objekt, der vil blive oprettet. Den valgfri propertiesObject
argumentet er a liste over egenskaber du vil måske tilføje til det nye objekt.
klasse A constructor () message ) console.log ('besked fra A') var obj = Object.create (ny A (), data: skrivbar: true, konfigurerbar: true, value: funktion () return'data fra obj ')) console.log (obj.message ()) // besked fra A console.log (obj.data ()) // data fra obj obj1 = Object.create ( ny A (), foo: skrivbar: true, konfigurerbar: true, value: function () return foo fra obj1 ' console.log (obj1.message ()) // besked fra en konsol. log (obj1.foo ()) // foo fra obj1
I obj
objekt, den tilføjede egenskab er data
, mens i obj1
, det er foo
. Så som vi ser, kan vi have egenskaber og metoder tilføjet til et nyt objekt.
Dette er fantastisk, når du vil oprette flere genstande af samme art men med forskellige supplerende egenskaber eller metoder. Det Object.create ()
syntax sparer besværet med at kode dem alle for sig.