JavaScript è un linguaggio fortemente orientato agli oggetti.
Per scrivere codice OO con JS si utilizzano costrutti differenti rispetto agli altri linguaggi di programmazione.
C,C#, C++, Java, PHP, Ruby utilizzano infatti il costrutto “class” mentre JS utilizza “function”.
Anche il modo con il quale si definiscono il costruttore, i metodi e le variabili “di classe” differisce fortemente dagli altri linguaggi.
Terminologia di base:
- Classe : definisce le caratteristiche di un oggetto
- Oggetto : un’istanza di una classe
- Costruttore : un metodo chiamato alla creazione di un oggetto
- Proprietà : una oggetto che memorizza un’informazione
- Metodo: una funzione di una classe
Creazione di una nuova classe
Javascript è un linguaggio orientato al “prototipo”. Qualsiasi oggetto JS possiede un “prototype” che supplisce alla mancanza dell’istruzione class e che rappresenta lo scheletro dell’oggetto. Si utilizza “prototype” per definire una classe e per estenderla.
esempio:
function rettangolo() {}
Definisce la classe rettangolo.
Creazione di un oggetto
Per utilizzare un oggetto è necessario crearne un’istanza.
Per fare questo si utilizza l’istruzione new.
L’esempio che segue crea due istanze della classe rettangolo.
function rettangolo() {}
var r1 = new rettangolo();
var r2 = new rettangolo();
Definizione del costruttore
Il costruttore è una particolare funzione che viene invocata automaticamente al momento della creazione di una istanza ed è usualmente utilizzato per inizializzare le proprietà di una classe (le sue variabili di stato) e per questo può possedere dei parametri.
Creando una nuova istanza della classe rettangolo e non avendo definito un costruttore personalizzati, viene invocato il costruttore di default che non fa nulla.
In Javascript non si definisce esplicitamente un costruttore ma viene considerato “costruttore” tutto il codice che è al
di fuori di un metodo all’interno di una “classe” (una funzione in JS).
Esempio:
function rettangolo()
{
alert('Sono un rettangolo!');
}
var r1 = new rettangolo();
Il codice precedente stamperà un codice di alert con il messaggio “Sono un rettangolo!” come conseguenza della creazione dell’oggetto r1.
Definizione delle proprietà
Le proprietà di un oggetto costituiscono le sue unità di memorizzazione.
Per definire una proprietà si usa il codice all’interno del costruttore.
Si utilizza il riferimento implicito “this” e si agisce in questo modo sul prototipo della funzione stessa.
Nell’esempio che segue aggiungeremo le proprietà larghezza e altezza al rettangolo e modificheremo il costruttore per
inizializzarne il valore:
function rettangolo(lun,alt)
{
this.larghezza = lun; // creazione e inizializzazione della propietà larghezza
this.altezza = alt; // creazione e inizializzazione della propietà altezza
}
var r1 = new rettangolo(10,20);
var r2 = new rettangolo(30,40);
Creazione di metodi
Creare un metodo è analogo a creare una proprietà.
Bisogna definire un nome di funzione e assegnare ad essa un’istanza di una funzione con eventualmente i parametri.
L’esempio chiarisce meglio questo concetto.
function rettangolo(lun,alt)
{
this.larghezza = lun; // creazione e inizializzazione della propietà larghezza
this.altezza = alt; // creazione e inizializzazione della propietà altezza
this.stampa = function()
{
alert("Sono un rettangolo "+this.larghezza+" X "+this.altezza);
}
}
var r1 = new rettangolo(10,20);
r1.stampa(); // Richiama il metodo stampa
Ereditarietà
Una delle caratteristiche comuni a tutti i linguaggi OO è l’ereditarietà.
L’ereditarietà viene implementata in JS assegnando ad una classe il prototipo di un’altra.
Facendo questo tutti i metodi della prima classe vengono ereditati dalla seconda.
Fatto questo è possibile definire o ridefinire altri metodi o proprietà.
L’esempio che crea una classe rettangolo_new che eredita dalla classe rettangolo e nella quale viene ridefinito il metodo stampa.
Da notare che per creare un metodo viene utilizzato il prototipo della funzione come riferimento alla struttura della classe analogamente a quanto accade all’interno della classe con “this”.
function rettangolo_new(lun,alt)
{
}
rettangolo_new.prototype = rettangolo.prototype;
rettangolo_new.prototype.stampa = function()
{
alert('Sono un nuovo rettangolo');
}
Polimorfismo
Una classe JS può definire più metodi con lo stesso nome caratterizzati da un numero differente di parametri.