lunedì, novembre 17, 2014

Ma ... funzioni costruttore? senza classe? mah ...

Purtroppo esistono diversi modi per creare un oggetto.

Quello piu' comune è attraverso la notazione json (object literal)

 var automobile = { cilindrata: 1300, colore:'rosso'};  

Lo stesso oggetto possiamo costruirlo utilizzando una funzione costruttore, che non è altro che una funzione invocata tramite l'operatore new. Vi ricorda qualcosa?


 var Auto = function(cilindrata, colore) {  
   this.cilindrata = cilindrata;  
   this.colore = colore;  
 }  
 var automobile = new Auto(1300,'rosso');  

Auto è una funzione costruttore, quando invocata con l'operatore new, this punta all'oggetto che viene appena creato, a cui si agganciano dinamicamente le proprietà cilindrata e colore: anche se non è evidenziato, l'ultima istruzione di una funzione costruttore, quando invocata con il new, ritorna l'oggetto this appena creato.

Cosa succede se ci dimentichiamo di utilizzare l'operatore new?

 var Auto = function(cilindrata, colore) {  
   this.cilindrata = cilindrata;  
   this.colore = colore;  
 }  
 var automobile = Auto(1300,'rosso');  


La funzione non ritorna alcun valore, quindi automobile ha il valore undefined, eseguendo la funzione Auto(1300, 'rosso'), aggiungiamo dinamicamente le due proprietà a this che in realtà punta a window con l'effetto di riempire lo scope global con tante variabili globali!  E' buona norma utilizzare la lettera maiuscola per identificare una funzione di tipo costruttore.

E' utile evidenziare che le due modalità di creazione degli oggetti sono assolutamente equivalenti.
Il concetto di funzione costruttore è stato introdotto per rendere familiare il linguaggio javascript ai programmatori java, ma è fuorviante perchè non esiste il concetto di Classe in Javascript, esiste solo il concetto di oggetto:

 var o1 = new Object();  
 
 var o2 = {};  

Nell'esempio, o1 e o2 sono due oggetti equivalenti. Il primo è costruito con la funzione costruttore Object(), il secondo con la notazione json.

Quindi fatevi un favore, evitate di usarla, la funzione costruttore, se ne puo' fare tranquillamente a meno ;)

Alla prox
Ivan

Nessun commento:

Posta un commento