sabato 3 maggio 2014

Ereditarietà del prototipo in JavaScript

Si può abbreviare il codice eliminando la riga che carica i passeggeri a seconda del parametro quando l'oggetto viene istanziato, in quanto la funzione carica() fa la medesima cosa, quindi si può far partire direttamente il metodo carica() all'atto dell'istanziazione.
function Veicolo(passeggeri){
 this.velocita=0;
 this.passeggeri=0;
 
 this.carica=function(passeggeri){
  if(passeggeri>0) this.passeggeri+=passeggeri;
 }
 
 this.carica(passeggeri);
}


var Auto=new Veicolo(1);

Auto.carica(2);

document.write(Auto.passeggeri+"<br>");
...col medesimo risultato.


Io vado più lento del tutorial:
Creo un costruttore Aereo, al quale attribuisco una funzione che fa parte di Veicolo, e vediamo cosa succede:
function Aereo(passeggeri){
        this.passeggeri=0;
 this.carica(passeggeri);
}

var Jumbo=new Aereo(250);

document.write(Jumbo.passeggeri+"<br>");
E ottengo un errore dal web developer di FireFox:
TypeError: this.carica is not a function

E certo: il costruttore Aereo non ha la funzione carica()!

Posso inserirla nel prototipo:
function Veicolo(passeggeri){
 this.velocita=0;
 this.passeggeri=0;
 
 this.carica=function(passeggeri){
  if(passeggeri>0) this.passeggeri+=passeggeri;
 }
 
 this.carica(passeggeri);
}

function Aereo(passeggeri){
 this.passeggeri=0;
 this.carica(passeggeri);
}

Aereo.prototype.carica=function(passeggeri){
 if(passeggeri>0) this.passeggeri+=passeggeri;
}

var Jumbo=new Aereo(250);

document.write(Jumbo.passeggeri+"<br>");
...e funziona, stavolta:
250

Però il tutorial mi pone un mezzo per ereditare un altro costruttore mediante il prototipo:
function Veicolo(passeggeri){
 this.velocita=0;
 this.passeggeri=0;
 
 this.carica=function(passeggeri){
  if(passeggeri>0) this.passeggeri+=passeggeri;
 }
 
 this.carica(passeggeri);
}

function Aereo(passeggeri){
 this.passeggeri=0;
 this.carica(passeggeri);
}

Aereo.prototype=new Veicolo();

var Jumbo=new Aereo(250);

document.write(Jumbo.passeggeri+"<br>");
Che funziona!
250

Benissimo!
Dunque ho la possibilità di ereditare tramite prototipo.
Il prototipo della classe Veicolo ha proprietà e metodi del costruttore.
Riportare nel prototipo di una nuova classe il prototipo di una classe dalla quale si voglia ereditare è possibile con questa formula!

Nessun commento:

Posta un commento