Sono nuovo su JavaScript OOP. Puoi spiegare la differenza tra i seguenti blocchi di codice. Ho provato ed entrambi i blocchi funzionano. Qual è la migliore pratica e perché?Informazioni sull'eredità prototipale in JavaScript
Primo blocco:
function Car(name){
this.Name = name;
}
Car.prototype.Drive = function(){
document.write("My name is " + this.Name + " and I'm driving. <br />");
}
SuperCar.prototype = new Car();
SuperCar.prototype.constructor = SuperCar;
function SuperCar(name){
Car.call(this, name);
}
SuperCar.prototype.Fly = function(){
document.write("My name is " + this.Name + " and I'm flying! <br />");
}
var myCar = new Car("Car");
myCar.Drive();
var mySuperCar = new SuperCar("SuperCar");
mySuperCar.Drive();
mySuperCar.Fly();
Secondo blocco:
function Car(name){
this.Name = name;
this.Drive = function(){
document.write("My name is " + this.Name + " and I'm driving. <br />");
}
}
SuperCar.prototype = new Car();
function SuperCar(name){
Car.call(this, name);
this.Fly = function(){
document.write("My name is " + this.Name + " and I'm flying! <br />");
}
}
var myCar = new Car("Car");
myCar.Drive();
var mySuperCar = new SuperCar("SuperCar");
mySuperCar.Drive();
mySuperCar.Fly();
Perché l'autore aggiungere Drive
e Fly
metodi utilizzando prototype
, ma non li dichiarano come this.Drive
metodo all'interno Car
di classe e this.Fly
nella classe SuperCar
?
Perché è necessario impostare SuperCar.prototype.constructor
su SuperCar
? La proprietà del costruttore è stata sostituita quando è impostato prototype
? Ho commentato questa riga e nulla è cambiato.
Perché chiamare il Car.call(this, name);
nel costruttore SuperCar
? Will non proprietà e metodi di Car
essere 'ereditati' quando faccio
var myCar = new Car("Car");
Il modo più moderno è quello di utilizzare Object.create () invece di nuovo: http://ncombo.wordpress.com/2013/07/11/javascript-inheritance-done-right/ – Jon
Solo una nota di questo esempio può confondere: "super" in questo caso si riferisce a una macchina volante, mentre "super" in OOP si riferisce normalmente al prototipo/classe genitore. – mikemaccana
Penso che la parte che rende l'eredità prototipica di JavaScript difficile da capire è dove si mescola con un costruttore. Cosa succede se rimuoviamo l'idea del costruttore e della classe e abbiamo solo oggetti. Ogni oggetto è o ereditato dal nulla (null) o da un altro oggetto. Sarà molto più facile da capire, ed è esattamente ciò che fa Object.create(). –