Hemsida » Kodning » Objektorienterad JavaScript (OOJS) 3 sätt att skapa objektinstanser

    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 newTargetprototyp (för att vara exakt, det är prototypen av newTargetkonstruktö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 Bkonstruktö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.