Ich bin neu in JavaScript OOP. Können Sie den Unterschied zwischen den folgenden Code-Blöcken erklären? Ich habe getestet und beide Blöcke funktionieren. Was ist die beste Praxis und warum?Vererbung der prototypischen Vererbung in JavaScript
Erster Block:
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();
Zweiter Block:
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();
Warum der Autor Drive
und Fly
Methoden nicht hinzugefügt prototype
verwenden, aber nicht erklären, sie nicht als this.Drive
Methode innerhalb Car
Klasse und this.Fly
in SuperCar
Klasse?
Warum muss SuperCar.prototype.constructor
auf SuperCar
zurückgesetzt werden? Wird die Konstruktoreigenschaft überschrieben, wenn prototype
festgelegt ist? Ich habe diese Zeile auskommentiert und nichts hat sich geändert.
Warum Car.call(this, name);
in SuperCar
Konstruktor aufrufen? Werden nicht die Eigenschaften und Methoden von Car
‚geerbt‘, wenn ich
var myCar = new Car("Car");
Die moderneren Weg zu Object.create verwenden () statt neu: http://ncombo.wordpress.com/2013/07/11/javascript-inheritance-done-right/ – Jon
Nur eine Anmerkung dieses Beispiel kann verwirrend sein: "Super" bezieht sich in diesem Fall auf ein fliegendes Auto, während "Super" in OOP normalerweise auf den Elternprototyp/Klasse verweist. – mikemaccana
Ich denke, der Teil, der die prototypische Vererbung von JavaScript erschwert, ist, wo es mit einem Konstruktor gemischt wird. Was, wenn wir die Idee des Konstruktors und der Klasse entfernen und wir nur Objekte haben. Jedes Objekt wird entweder von nichts (null) oder von einem anderen Objekt geerbt. Das wird viel einfacher zu verstehen sein, und genau das macht Object.create(). –