Ci provo.
Inizio con il creare una classe Madre e una classe Figlia.
function Madre(){
var nome="";
this.nomina=function(n){
nome=n;
}
this.presentati=function(){
alert("Mi chiamo "+nome);
}
}
function Figlia(){
var soprannome="";
}
Figlia.prototype=new Madre();
Ora creo due istanze della classe Madre e le nomino. Si dovrebbero presentare ognuna con il suo nome:
Maria=new Madre();
Maria.nomina("Maria");
Lucia=new Madre();
Lucia.nomina("Lucia");
Maria.presentati();
Lucia.presentati();
...e ottengo "Mi chiamo Maria" e "Mi chiamo Lucia". Come previsto.
Ora creo due istanze della classe Figlia...
Barbara=new Figlia();
Barbara.nomina("Barbara");
Giuliana=new Figlia();
Giuliana.nomina("Giuliana");
Barbara.presentati();
Giuliana.presentati();
E cosa ottengo?Ottengo per due volte "Mi chiamo Giuliana"!
Se inverto le due:
Giuliana=new Figlia();
Giuliana.nomina("Giuliana");
Barbara=new Figlia();
Barbara.nomina("Barbara");
Giuliana.presentati();
Barbara.presentati();
Ottengo per due volte "Mi chiamo Barbara"!
Evidentemente la funzione Madre viene utilizzata da ambedue, e mentre all'inizio il metodo nomina dell'istanza Barbara modifica la variabile nome in "Barbara", successivamente il metodo nomina dell'istanza Giuliana modifica la stessa variabile nome in "Giuliana".
O viceversa.
La soluzione?
<script>
function Madre(){
var nome="";
this.nomina=function(n){
nome=n;
}
this.presentati=function(){
alert("Mi chiamo "+nome);
}
}
function Figlia(){
Madre.call(this);
var soprannome="";
}
Figlia.prototype=new Madre();
Giuliana=new Figlia();
Giuliana.nomina("Giuliana");
Barbara=new Figlia();
Barbara.nomina("Barbara");
Giuliana.presentati();
Barbara.presentati();
</script>
Il fatto è che le istanze della classe derivata condividono una sola istanza della classe genitrice. Se una variabile in questa non è dichiarata this, si fa riferimento a una sola variabile, che viene modificata ora da una ora dall'altra istanza. Non è molto facile, ma sembra che ci sto cominciando a capire qualcosa, dato che sono riuscito a personalizzare l'esempio del tutorial creandomi, come sempre un esempio tutto mio.
Nessun commento:
Posta un commento