Objektově orientovaný JavaScript (OOJS) 3 způsoby vytváření instancí objektů
Když je programovací jazyk vše o objektech, první věc, kterou se musíme naučit, je jak vytvářet objekty. Vytváření objektů v JavaScriptu je poměrně snadné: pár složených závorek to bude dělat ani jediný způsob vytvořit objekt ani jediný způsob budete muset použít.
V JavaScriptu jsou instance objektů vytvořené z vestavěných objektů existenci, když program běží. Například, datum
je vestavěný objekt, který nám poskytuje informace o datech. Pokud chceme na stránce ukázat aktuální datum, my potřebovat runtime instanci datum
informace o aktuálním datu.
JavaScript nám také umožňuje definovat naše vlastní objekty které mohou vytvářet vlastní instance objektů v běhu. V JavaScriptu, všechno je objekt a každý objekt má konečný předek volal Objekt
. Zavolá se vytvoření instance objektu konkretizace.
1. Nový
operátor
Jedna z nejběžnějších a nejznámějších metod pro vytvoření nové instance objektu je za použití Nový
operátor.
Potřebuješ konstruktor udělat Nový
práce operátora. Konstruktor je metoda objektu, který spojuje a nové instance tohoto objektu. Jeho základní syntaxe vypadá takto:
nový konstruktor ()
Konstruktor může přijmout argumenty které lze použít ke změně nebo přidání vlastností k instanci objektu, kterou vytvoří. Konstruktor má stejný název patří objekt.
Zde je příklad, jak vytvořit instanci Datum()
objekt s Nový
klíčové slovo:
dt = new Datum (2017, 0, 1) console.log (dt) // Ne Jan 01 2017 2017: 00:00:00 GMT + 0100
Datum()
je konstruktor vytvořit nový datum
objekt. Různé konstruktory pro objekt přijmout různé argumenty vytvořit stejný druh instancí objektu pomocí rozmanité atributy.
Ne všechny vestavěné objekty v JavaScriptu mohou být instancovány jako datum
. Tam jsou objekty, které Nepřiďte s konstruktorem: Matematika
, JSON
a Odraz
, ale jsou to stále obyčejné předměty.
Mezi vestavěné objekty, které mají konstruktor (y), Symbol
nelze volat ve stylu konstruktoru vytvořit instanci nového Symbol
instance. Může to být jen volání jako funkce který vrací nový Symbol
hodnota.
Také mezi vestavěnými objekty, které mají konstruktor (y), ne všichni potřebují, aby jejich konstruktéři byli voláni pomocí Nový
operátora, aby mohl být vytvořen. Funkce
, Array
, Chyba
, a RegExp
lze také nazývat jako funkce, bez použití Nový
klíčové slovo, a vytvoří instanci a vrátí novou instanci objektu.
2. Odraz
objekt
Programátoři backendu už možná znají Reflexní API. Odraz je funkcí programovacích jazyků kontrolovat a aktualizovat některé základní subjekty, například objekty a třídy, za běhu.
V JavaScriptu můžete již provádět nějaký reflexní operace pomocí Objekt
. Ale, a správného Reflection API nakonec také existoval v JavaScriptu.
Odraz
objekt má sadu metod vytvořit a aktualizovat instance objektů. Odraz
objekt nemá konstruktor, tak to nemůže být instalováno s Nový
operátora a podobně Matematika
a JSON
, to nelze volat jako funkci buď.
nicméně, Odraz
má ekvivalentní Nový
operátor: Reflect.construct ()
metoda.
Reflect.construct (cíl, argumentsList [, nový cíl])
Oba cílová
a volitelné newTarget
argumenty jsou objekty, které mají své vlastní konstruktéry, zatímco argumentsList
je seznam argumentů být předán konstruktérovi cílová
.
var dt = Reflect.construct (Datum, [2017, 0, 1]); console.log (dt); // Ne Jan 01 2017 00:00:00 GMT + 0100
Výše uvedený kód má stejný účinek jako konkretizace Datum()
za použití Nový
operátor. I když můžete stále používat Nový
, Odraz je Standard ECMAScript 6. To také umožňuje využít newTarget
argument, což je další výhoda oproti Nový
operátor.
Hodnota newTarget
prototyp (abych byl přesný, je to prototyp newTarget
konstruktér) se stane prototypem nově vytvořené instance.
Prototyp je vlastnost objektu, hodnota, která je také objekt, přenášení vlastností původního objektu. Stručně řečeno, objekt získá své členy z jeho prototypu.
Podívejme se na příklad:
class konstructor () this.message = function () console.log ('zpráva od A') třída B constructor () message () console.log ('zpráva od B') data () console.log ('data z B') obj = Reflect.construct (A, [], B) console.log (obj.message ()); // zpráva z A console.log (obj.data ()); // data z B console.log (obj instanceof B) // true
Předáním B
jako třetí argument Reflect.construct ()
, hodnota prototypu obj
objekt je aby byly stejné jako prototyp B
konstruktoru (který má vlastnosti zpráva
a data
).
Tím pádem, obj
přístup k zpráva
a data
, k dispozici na jeho prototypu. Ale od obj
se provádí A
, má také své vlastní zpráva
to od A
.
Přestože obj
je konstruován jako pole, to je není instancí Array
, protože jeho prototyp je nastaven na Objekt
.
obj = Reflect.construct (Array, [1,2,3], Object) console.log (obj) // Array [1, 2, 3] console.log (obj instanceof Array) // false
Reflect.construct ()
může být užitečné, když chcete vytvořit objekt pomocí více než jednoho plánu.
3. Object.create ()
metoda
Můžete také vytvořit nový obyčejný objekt se specifickým prototypem přes Object.create ()
. To se také může zdát velmi podobné použití Nový
operátor, ale není to tak.
Object.create (O [, propertiesObject])
Ó
argument je objekt, který slouží prototypu pro nový objekt, který bude vytvořen. Volitelné propertiesObject
argument je seznam vlastností můžete přidat nový objekt.
třída A konstructor () message () console.log ('zpráva od A') var obj = Object.create (nový A (), data: zapisovatelný: true, konfigurovatelný: true, hodnota: function () return 'data z obj') console.log (obj.message ()) // zpráva z console.log (obj.data ()) // data z obj obj1 = Object.create ( new A (), foo: writable: true, konfigurovatelné: true, hodnota: function () return 'foo z obj1') console.log (obj1.message ()) // zpráva z A konzoly. log (obj1.foo ()) // foo z obj1
V obj
objekt, přidaná vlastnost je data
, zatímco v obj1
, to je foo
. Takže, jak vidíte, můžeme mít vlastnosti a metody přidané do nového objektu.
To je skvělé, když chcete vytvořit více objektů stejného druhu ale s různých doplňkových vlastností nebo metod. Object.create ()
syntaxe šetří problémy s jejich kódováním.