Objektorienterad JavaScript (OOJS) 3 sätt att skapa objektinstanser
När ett programmeringsspråk är Allt om objekt, Det första vi behöver lära oss är hur man skapar objekt. Att skapa objekt i JavaScript är ganska enkelt: ett par lockiga hängslen kommer att göra jobbet, det är dock varken det enda sättet att skapa ett objekt inte heller det enda sättet du behöver någonsin använda.
I JavaScript är objekt instanser skapad från inbyggda objekt och kommer till existens när programmet körs. Till exempel, Datum
är ett inbyggt objekt som ger oss information om datum. Om vi vill visa det aktuella datumet på en sida, vi behöver en runtime instans av Datum
som bär informationen om det aktuella datumet.
JavaScript tillåter oss också att definiera våra egna objekt som kan producera egna objekt instanser i runtime. I JavaScript, allt är ett föremål och varje objekt har en ultimata förfader kallad Objekt
. Skapandet av en objektinstans kallas instansiering.
1. Den ny
operatör
En av de vanligaste och mest kända metoderna för att skapa en ny objektinstans är av använda ny
operatör.
Du behöver en konstruktör att göra ny
operatörsarbete. En konstruktör är en metod för ett objekt som sätter samman en ny instans av det objektet. Dess grundläggande syntax ser ut så här:
ny konstruktör ()
En konstruktör kan acceptera argument som kan användas för att ändra eller lägga till egenskaper i objektet som det konstruerar. Konstruktören har samma namn som objektet tillhör.
Här är ett exempel på hur man skapar en Exempel på Datum()
objekt med ny
nyckelord:
dt = nytt datum (2017, 0, 1) console.log (dt) // sön jan 01 2017 00:00:00 GMT + 0100
Datum()
är konstruktören att skapa en ny Datum
objekt. Olika konstruktörer för ett objekt ta olika argument att skapa samma typ av objekt instanser med varierade attribut.
Inte alla inbyggda objekt i JavaScript kan ordnas som Datum
. Det finns föremål som kom inte med en konstruktör: Matematik
, JSON
och Reflektera
, men de är fortfarande vanliga föremål.
Bland de inbyggda objekten som har konstruktör (er), Symbol
kan inte kallas i konstruktorns stil att inställa en ny Symbol
exempel. Det kan bara vara kallas som en funktion som returnerar en ny Symbol
värde.
Även bland de inbyggda objekten som har konstruktörer behöver inte alla sina konstruktörer kallas med ny
operatör för att bli instansierad. Fungera
, Array
, Fel
, och RegExp
kan också kallas som funktioner, utan att använda ny
sökord, och de kommer att omorganisera och returnera en ny objektinstans.
2. Den Reflektera
objekt
Backendprogrammerare kanske redan är bekanta med Reflektions API. Reflektion är en egenskap av programmeringsspråk till inspektera och uppdatera några av de grundläggande enheterna, till exempel föremål och klasser, vid körning.
I JavaScript kunde du redan utföra några reflektionsoperationer med Objekt
. Men, a korrekt reflektions API så småningom kom att existera i JavaScript också.
De Reflektera
objektet har en uppsättning metoder för att skapa och uppdatera objekt instanser. De Reflektera
objekt har ingen konstruktör, så det kan inte instanseras med ny
operatör, och precis som Matematik
och JSON
, Det kan inte kallas som en funktion antingen.
dock, Reflektera
har en ekvivalent av ny
operatör: Reflect.construct ()
metod.
Reflect.construct (mål, argumentsList [, newTarget])
Både mål
och det frivilliga newTarget
argument är föremål som har sina egna konstruktörer, medan argumentsList
är en lista över argument att skickas till konstruktören av mål
.
var dt = Reflect.construct (Datum, [2017, 0, 1]); console.log (dt); // sön 01 jan 2017 00:00:00 GMT + 0100
Koden ovan har samma effekt som instantiating Datum()
använda ny
operatör. Även om du fortfarande kan använda ny
, Reflektion är en ECMAScript 6-standarden. Det tillåter dig också att utnyttja newTarget
argument, vilket är en annan fördel jämfört med ny
operatör.
Värdet av newTarget
prototyp (för att vara exakt, det är prototypen av newTarget
konstruktör) blir prototypen för den nyligen skapade förekomsten.
En prototyp är objektets egendom, vars värde är också ett föremål, som bär originalets egenskaper. Kort sagt, ett objekt får sina medlemmar från sin prototyp.
Låt oss se ett exempel:
Klass B Konstruktör () Meddelande () Console.log ("Meddelande från A") Klass B Konstruktör () Meddelande () Console.log ("Meddelande från B") data () console.log ('data från B' obj = Reflect.construct (A, [], B) console.log (obj.message ()); // meddelande från en console.log (obj.data ()); // data från B console.log (obj instanceof B) // true
Genom att passera B
som det tredje argumentet till Reflect.construct ()
, prototypvärdet av obj
objektet är gjord för att vara samma som prototypen av B
konstruktör (som har egenskaperna meddelande
och data
).
Således, obj
kan komma åt meddelande
och data
, tillgänglig på dess prototyp. Men eftersom obj
görs med användning av en
, den har också sin egen meddelande
Det mottaget från en
.
Även om obj
är konstruerad som en array, det är inte en förekomst av Array
, eftersom dess prototyp är inställd på 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 vara användbar när du vill skapa ett objekt använder mer än en ritning.
3. Den Object.create ()
metod
Du kan också skapa en nytt vanligt föremål med en specifik prototyp via Object.create ()
. Det här kan också tyckas mycket liknar att använda ny
operatör, men det är det inte.
Object.create (O [, propertiesObject])
De O
argument är ett objekt som tjänar prototypen för det nya objektet som kommer att skapas. Den frivilliga propertiesObject
argumentet är a lista över egenskaper du kanske vill lägga till det nya objektet.
klass A constructor meddelande console.log ("meddelande från A") var obj = Object.create (nytt A (), data: skrivbar: sann, konfigurerbar: true, value: funktion () returnera data från obj ')) console.log (obj.message ()) // meddelande från A console.log (obj.data ()) // data från obj obj1 = Object.create ( ny A (), foo: skrivbar: sant, konfigurerbar: true, value: function () return foo från obj1) console.log (obj1.message ()) // meddelande från en konsol. logga (obj1.foo ()) // foo från obj1
I obj
objekt, den tillagda egenskapen är data
, medan i obj1
, dess foo
. Så som vi ser kan vi ha egenskaper och metoder som läggs till i ett nytt objekt.
Det här är bra när du vill skapa flera föremål av samma slag men med olika kompletterande egenskaper eller metoder. De Object.create ()
syntax sparar besväret att koda alla av dem separat.