JavascriptProva

venerdì 10 febbraio 2012

Una proprietà unica della classe genitrice per le classi derivate...

Ho un'altra idea per vedere se con classi derivate si può instaurare quel tipo di confusione di cui parla il sito che sto seguendo...
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