Soy nuevo en JavaScript OOP. ¿Puedes explicar la diferencia entre los siguientes bloques de código? Probé y ambos bloques funcionan. ¿Cuál es la mejor práctica y por qué?Comprender herencia prototípica en JavaScript
Primer bloque:
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();
Segundo bloque:
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();
¿Por qué el autor añade Drive
y Fly
métodos usando prototype
, pero no se le declara como this.Drive
método dentro de la clase y Car
this.Fly
en SuperCar
clase?
¿Por qué SuperCar.prototype.constructor
debe volver a establecerse en SuperCar
? ¿La propiedad del constructor se reemplaza cuando se establece prototype
? Comenté esta línea y nada cambió.
¿Por qué llamar al Car.call(this, name);
en el constructor SuperCar
? No van a propiedades y métodos de Car
ser 'heredados' cuando lo haga
var myCar = new Car("Car");
La forma más moderna es el uso de Object.create () en lugar de nuevo: http://ncombo.wordpress.com/2013/07/11/javascript-inheritance-done-right/ – Jon
Solo una nota, este ejemplo puede ser confuso: 'super' en este caso se refiere a un auto volador, mientras que 'super' en OOP normalmente se refiere al prototipo/clase principal. – mikemaccana
Creo que la parte que hace que la herencia prototípica de JavaScript sea difícil de entender es cuando se mezcla con un constructor. Qué pasa si eliminamos la idea del constructor y la clase, y solo tenemos objetos. Cada objeto se hereda de nada (nulo) o de otro objeto. Eso será mucho más fácil de entender, y es precisamente lo que Object.create() hace. –