Classi in Javascript

JavaScript e' un linguaggio potente ed elegante. A prima vista, una caratteristica che sembra mancare al linguaggio e' quella della programmazione orientata agli oggetti. Tuttavia, JavaScript incorpora un sistema molto robusto per la prototipizzazione di oggetti. Per iniziare, consideriamo la seguente funzione:

function Person( name ) {
this.name = name;
}



In aggiunta al ruolo tradizionale, le funzioni agiscono da base per la prototipizzazione delle classi. Possiamo creare una nuova istanza di Persona con un codice simile al seguente:

var bob = new Person( "Bob" );
var alice = new Person( "Alice" );



bob e' un oggetto creato dal prototype Person definito al passo precedente. Interrogando bob.name, quindi, troveremmo che la stringa contenuta e' "Bob". L'oggetto bob possiede alcuni metodi, come toString(), che vengono ereditati da un oggetto padre: Object (ne parleremo tra un po').

A differenza dei tradizionali linguaggi ad oggetti tipati staticamente (ad esempio, Java), i prototipi di JavaScript possono essere modificati al volo. Questo significa che ogni istanza ricevera' i cambiamenti effettuati in maniera automatica. Ad esempio, supponiamo di volere aggiungere alla classe Person creata sopra un metodo greet(). Possiamo procedere come segue:

Person.prototype.greet = function ( otherPerson ) {
alert( "Hello " + otherPerson.name + ", I'm " + this.name );
};



Adesso, possiamo fare salutare allegramente Bob ed Alice:

bob.greet( alice );
alice.greet ( bob );



Quando chiamiamo bob.greet(), il motore JavaScript ricerca una funzione greet nei seguenti posti:

1. Una property di bob
2. Una property di Person (Person.prototype)
3. Una property di Object (Object.prototype)

Nel nostro caso, il motore JavaScript trova la funzione greet() come property di Person e non controlla altrove. D'altro canto, chiamando bob.toString() forzeremmo il motore a cercare sino ad Object. E' possibile modificare questo comportamento definendo una property toString nell'oggetto Person:

Person.prototype.toString = function() {
return this.name.toString();
};



I tre luoghi definiti sopra sono gli unici in cui JavaScript cerchera' una property. Questo significa che JavaScript non supporta nativamente l'estensione di un prototipo ad un altro, come si farebbe in un classico linguaggio ad oggetti subclassando l'oggetto. Ovviamente, e' possibile modificare questo comportamento ed ottenere un pieno supporto per l'ereditarieta' e l'ereditarieta' multipla.