JavaScript orientato agli oggetti (OOJS) 3 modi per creare istanze di oggetti
Quando è un linguaggio di programmazione tutto sugli oggetti, la prima cosa che dobbiamo imparare è come creare oggetti. Creare oggetti in JavaScript è abbastanza facile: un paio di parentesi graffe farà il lavoro, tuttavia, questo è né l'unico modo per creare un oggetto né l'unico modo avrai sempre bisogno di usare.
In JavaScript, le istanze dell'oggetto sono creato da oggetti built-in e venire all'esistenza quando il programma è in esecuzione. Per esempio, Data
è un oggetto incorporato che ci fornisce informazioni sulle date. Se vogliamo mostrare la data corrente su una pagina, noi bisogno di un'istanza di runtime di Data
che porta le informazioni sulla data corrente.
JavaScript ci consente anche di definire i nostri oggetti che può produrre le proprie istanze di oggetti in runtime. In JavaScript, tutto è un oggetto e ogni oggetto ha un ultimo antenato chiamato Oggetto
. Viene chiamata la creazione di un'istanza di oggetto instantiation.
1. Il nuovo
operatore
Uno dei metodi più comuni e conosciuti per creare una nuova istanza di un oggetto è di usando il nuovo
operatore.
Avete bisogno di un costruttore fare il nuovo
lavoro dell'operatore. Un costruttore è un metodo di un oggetto che mette insieme a nuova istanza di quell'oggetto. La sintassi di base è la seguente:
nuovo costruttore ()
Un costruttore può accettare argomenti che può essere usato per cambiare o aggiungere proprietà all'istanza dell'oggetto che costruisce. Il costruttore ha lo stesso nome come l'oggetto a cui appartiene.
Ecco un esempio su come creare un istanza del Data()
oggetto con il nuovo
parola chiave:
dt = new Date (2017, 0, 1) console.log (dt) // dom 01 gen 2017 00:00:00 GMT + 0100
Data()
è il costruttore per creare un nuovo Data
oggetto. Diversi costruttori per un oggetto prendere argomenti diversi per creare lo stesso tipo di istanze di oggetto con attributi vari.
Non tutti gli oggetti incorporati in JavaScript possono essere istanziati come Data
. Ci sono oggetti che non venire con un costruttore: Matematica
, JSON
e Riflettere
, ma sono ancora oggetti ordinari.
Tra gli oggetti built-in che hanno constructor (s), Simbolo
non può essere chiamato nello stile del costruttore per istanziare un nuovo Simbolo
esempio. Può essere solo chiamato come una funzione che restituisce un nuovo Simbolo
valore.
Inoltre, tra gli oggetti built-in che hanno il / i costruttore / i, non tutti hanno bisogno che i loro costruttori vengano chiamati con il nuovo
operatore per essere istanziato. Funzione
, schieramento
, Errore
, e RegExp
può anche essere chiamato come funzioni, senza usare il nuovo
parola chiave e istanziano e restituiscono una nuova istanza di oggetto.
2. Il Riflettere
oggetto
I programmatori di backend potrebbero già avere familiarità con API di Reflection. La riflessione è una caratteristica dei linguaggi di programmazione ispezionare e aggiornare alcune delle entità di base, come oggetti e classi, in fase di esecuzione.
In JavaScript, potresti già eseguire alcuni operazioni di riflessione usando Oggetto
. Ma, a corretta API di Reflection alla fine venne ad esistere anche in JavaScript.
Il Riflettere
oggetto ha un insieme di metodi per creare e aggiornare istanze di oggetti. Il Riflettere
oggetto non ha un costruttore, quindi non può essere istanziato con il nuovo
operatore, e, proprio come Matematica
e JSON
, esso non può essere chiamato come una funzione o.
però, Riflettere
ha un equivalente del nuovo
operatore: il Reflect.construct ()
metodo.
Reflect.construct (target, argumentsList [, newTarget])
Entrambi i bersaglio
e l'opzionale NewTarget
gli argomenti sono oggetti con i propri costruttori, mentre argumentsList
è un lista di argomenti da passare al costruttore di bersaglio
.
var dt = Reflect.construct (Date, [2017, 0, 1]); console.log (dt); // dom 01 gen 2017 00:00:00 GMT + 0100
Il codice sopra ha lo stesso effetto come istanziare Data()
usando il nuovo
operatore. Anche se puoi ancora usarlo nuovo
, La riflessione è un ECMAScript 6 standard. Ti permette anche di fare uso del NewTarget
discussione, che è un altro vantaggio rispetto al nuovo
operatore.
Il valore di NewTarget
Il prototipo di (per essere precisi, è il prototipo di NewTarget
's costruttore) diventa il prototipo dell'istanza appena creata.
Un prototipo è il proprietà di un oggetto, il cui valore è anche un oggetto, portando le proprietà dell'oggetto originale. In breve, un oggetto ottiene i suoi membri dal suo prototipo.
Ecco, vediamo un esempio:
class A constructor () this.message = function () console.log ('message from A') class B constructor () message () console.log ('messaggio da B') data () console.log ('data from B') obj = Reflect.construct (A, [], B) console.log (obj.message ()); // messaggio da A console.log (obj.data ()); // dati da B console.log (obj instanceof B) // true
Passando B
come il terzo argomento a Reflect.construct ()
, il valore prototipo del obj
l'oggetto è fatto per essere lo stesso come il prototipo di B
Il costruttore (che ha le proprietà Messaggio
e dati
).
così, obj
può accedere a Messaggio
e dati
, disponibile al suo prototipo. Ma, da allora obj
è fatto usando UN
, ha anche il suo Messaggio
esso ricevuto da UN
.
Nonostante obj
è costruito come un array, lo è non un esempio di schieramento
, perché il suo prototipo è impostato su Oggetto
.
obj = Reflect.construct (Array, [1,2,3], Object) console.log (obj) // Array [1, 2, 3] console.log (obj instanceof Array) // false
Reflect.construct ()
può essere utile quando vuoi creare un oggetto usando più di un progetto.
3. Il Object.create ()
metodo
Puoi anche creare un nuovo oggetto ordinario con un prototipo specifico attraverso Object.create ()
. Anche questo potrebbe sembrare molto simile all'utilizzo del nuovo
operatore, ma non lo è.
Object.create (O [, propertiesObject])
Il O
argomento è un oggetto che serve il prototipo per il nuovo oggetto che verrà creato. L'opzionale propertiesObject
l'argomento è un lista di proprietà potresti voler aggiungere al nuovo oggetto.
class A constructor () message () console.log ('message from A') var obj = Object.create (new A (), data: scrivibile: true, configurabile: true, valore: function () return 'data from obj') console.log (obj.message ()) // messaggio da A console.log (obj.data ()) // dati da obj obj1 = Object.create ( nuovo A (), pippo: scrivibile: true, configurabile: true, valore: function () return 'pippo da obj1') console.log (obj1.message ()) // messaggio da una console. log (obj1.foo ()) // pippo di obj1
Nel obj
oggetto, la proprietà aggiunta è dati
, nel frattempo obj1
, suo foo
. Quindi, come vedi, possiamo avere proprietà e metodi aggiunti a un nuovo oggetto.
Questo è fantastico quando vuoi creare più oggetti dello stesso tipo ma con diverse proprietà o metodi supplementari. Il Object.create ()
la sintassi salva la difficoltà di codificarli tutti separatamente.