Tipi di riferimento in Javascript
Il linguaggio di programmazione JavaScript, oltre a consentire l'uso di oggetti predefiniti o incorporati, mi offre anche la possibilità di creare nuovi tipi di oggetti personalizzati.
Per definire un nuovo tipo di oggetto, devo fornire schemi che indicano a JavaScript come dovrebbe apparire l'oggetto, quali sono i suoi metodi e proprietà, e così via.
Questi schemi sono detti 'tipi di riferimento' (o Reference Types) e servono come modelli per la costruzione degli oggetti.
Nota. A differenza di altri linguaggi di programmazione orientati agli oggetti, come Java e C++, JavaScript non prevede una costruzione di classe formale. Tuttavia, l'equivalente logico, i 'tipi di riferimento', è pienamente supportato dal linguaggio. Quindi, quando si parla di 'tipi di riferimento', si intende qualcosa molto simile alle classi in altri linguaggi.
Ogni tipo di riferimento si compone di tre elementi principali:
- Costruttore
Il costruttore è un metodo invocato ogni volta che viene generato un nuovo oggetto basato su questo tipo di riferimento. È utile per inizializzare le proprietà dell'oggetto o per configurarlo in un determinato modo. Come le funzioni, un costruttore può ricevere o meno dei parametri in ingresso. - Metodi
I metodi rappresentano le funzionalità che possono essere applicate agli oggetti di un dato tipo di riferimento. Mi permettono di eseguire compiti specifici sugli oggetti, senza dover creare delle funzioni ad hoc. - Proprietà
Le proprietà di un oggetto rappresentano le informazioni memorizzate al suo interno. L'utilizzo di proprietà elimina la necessità di definire variabili separate per contenere queste informazioni.
Creare un tipo di riferimento
Prima di tutto devo definire il tipo di riferimento che voglio creare.
Ecco un esempio pratico.
- <script>
- // creo il tipo di riferimento
- function person (name, lastname, age) {
- this.firstName = name;
- this.lastName=lastname;
- this.age=age;
- };
- // creo una istanza
- var cliente = new person ("Paolo", "Rossi", 25);
- document.write(cliente.firstName);
- </script>
In questo caso creo un tipo di riferimento "person" composto da tre proprietà (firstName, lastName, age).
Poi invoco il tipo di riferimento per istanziare un oggetto "cliente" al tipo di riferimento "person" tramite la chiave new
var cliente = new person ("Paolo", "Rossi", 25)
Nell'istanza passo al tipo di riferimento tre parametri ("Paolo", "Rossi", "25") che saranno assegnati rispettivamente alle proprietà (firstName, lastName, age).
Infine, interrogo l'oggetto per leggere il contenuto della proprietà "firstName"
document.write(cliente.firstName)
Lo script accede alla proprietà "firstName" dell'oggetto "cliente" e stampa a video il suo contenuto ossia "Paolo"
Paolo
In questo modo posso accedere a qualsiasi proprietà dell'oggetto.
Esempio 2
Nel precedente sempio ho usato tre proprietà e nessun metodo nel tipo di riferimento.
Ora provo a implementare anche un metodo.
- <script>
- // creo il tipo di riferimento
- function person (name, lastname, age) {
- this.firstName = name;
- this.lastName=lastname;
- this.age=age;
- this.getName = function()
- {
- return this.firstName;
- }
- };
- // creo una istanza
- var cliente = new person ("Giuseppe", "Verdi", 54);
- document.write(cliente.getName());
- </script>
In questo caso script ho aggiunto il metodo getName che si limita a restituire il valore assegnato alla proprietà "firstName"
Poi invoco il metodo
document.write( cliente.getName() );
Il metodo legge e restituisce il valore assegnato alla proprietà "firstName"
Giuseppe
Esempio 3
Posso definire un metodo anche all'esterno del tipo di riferimento.
- <script>
- // creo il tipo di riferimento
- function person (name, lastname, age) {
- this.firstName = name;
- this.lastName=lastname;
- this.age=age;
- };
- person.prototype.getName2 = function()
- {
- return this.firstName;
- }
- // creo una istanza
- var cliente = new person ("Giuseppe", "Verdi", 54);
- document.write(cliente.getName2());
- </script>
Il risultato finale è sempre lo stesso.
document.write( cliente.getName2() );
Il metodo legge e restituisce il valore assegnato alla proprietà "firstName"
Giuseppe
E così via.