Ci sono due inconvenienti di piccolo taglio col tuo codice:
- Il prototipo non viene ereditato – “ (new Automobile(4, "blu")) instanceof Veicolo” restituisce false col tuo codice;
- Crei delle closures – se puoi, i metodi appendili sempre al prototipo invece di appenderli ogni volta alle istanze.
Ti giro un esempio chiarificatore:
codice:
/* Creo il costruttore "Veicolo" */
function Veicolo (ruote, colore){
this.ruote = ruote;
this.colore = colore;
}
/* Creo il costruttore "Automobile" */
function Automobile (ruote, colore) {
Veicolo.call(this, ruote, colore);
}
/* Rendo un'istanza di "Veicolo" prototipo del costruttore "Automobile" */
Automobile.prototype = Object.create(Veicolo.prototype);
Automobile.prototype.constructor = Automobile;
/* Creo i metodi; quelli di "Veicolo" verranno ereditati da "Automobile", ma non viceversa */
Veicolo.prototype.accelera = function (velocita) {
console.log("Vado a " + velocita);
};
Automobile.prototype.frena = function (secondi) {
console.log("Ho frenato in " + secondi);
};
Testiamo l'ereditarietà…
codice:
var miaAuto = new Automobile(4, "blu");
alert(miaAuto instanceof Automobile); // true
alert(miaAuto instanceof Veicolo); // true
P.S. Non esistono classi in JS (è quindi scorretto chiamarle tali), ma esiste di meglio: i costruttori!