javascript - sirve - Forma correcta de llamar a las funciones de superclase desde la subclase
para que sirve el comando super en java (5)
Después de leer todas las respuestas, estoy usando el siguiente mecanismo de herencia:
var SuperClass = function()
{
this.info = "I am superclass";
console.log("SuperClass:");
};
SuperClass.prototype.printInfo = function()
{
console.log("printing from superclass printInfo");
console.log("printinfo");
console.log(this.info);
};
var SubClass = function(){
SuperClass.call(this);
};
SubClass.prototype = Object.create(SuperClass.prototype);
SubClass.prototype.printInfo = function()
{
console.log("calling superclass");
Object.getPrototypeOf(SubClass.prototype).printInfo.call(this);
console.log("called superclass");
};
var sc = new SubClass();
sc.printInfo();
Tengo una "Superclase" con "información" como una variable de instancia. "SuperClass" tiene la función "printInfo ()". "printInfo ()" necesita acceder a la variable de instancia "información". Quiero crear una "Subclase" que también tenga el método "printInfo ()". Quiero llamar a printInfo () de "SuperClass" de "printInfo ()" de "SubClass".
SuperClass = function()
{
this.info = "I am superclass";
console.log("SuperClass:");
};
SuperClass.prototype.printInfo = function(that)
{
console.log("printing from superclass printInfo");
console.log(that.info);
};
SubClass = function(){};
SubClass.prototype = new SuperClass();
SubClass.prototype.printInfo = function()
{
console.log("calling superclass");
this.constructor.prototype.printInfo(this);
console.log("called superclass");
};
var sc = new SubClass();
sc.printInfo();
Puedes ver que estoy pasando "eso" como un parámetro para imprimir información. Sin ese parámetro, "info" se imprime como "indefinido". Como en el caso siguiente, "this.info" no está definido cuando se llama a esta función desde el objeto de "SubClass".
SuperClass.prototype.printInfo = function()
{
console.log("printing from superclass printInfo");
console.log(this.info);
};
¿Cuál es la forma correcta de anular e invocar métodos de superclase en javascript, permitiendo que las funciones accedan a variables de instancia de la clase?
Estás jugando con el SubClass
la SubClass
con el SubClass
la SubClass
, en esta línea
SubClass.prototype = new SuperClass();
el prototipo del niño debe depender del prototipo del padre. Entonces, puedes heredar así
SubClass.prototype = Object.create(SuperClass.prototype);
Además, es bastante normal cambiar el constructor a la función real, como este
SubClass.prototype.constructor = SubClass;
Para mantener su implementación genérica, puede usar Object.getPrototypeOf
, para obtener el prototipo padre en la cadena de herencia y luego invocar printInfo
, como este
SubClass.prototype.printInfo = function() {
Object.getPrototypeOf(SubClass.prototype).printInfo(this);
};
Dado que la info
se define en la SubClass
aún, se imprimirá undefined
. También es posible que desee llamar al constructor padre, como este
var SubClass = function() {
SuperClass.call(this);
};
Nota: Está creando variables globales, omitiendo la palabra clave var
antes de SuperClass
y SubClass
.
Puedes escribirlo así:
SuperClass.prototype.printInfo = function(){
console.log("printing from superclass printInfo");
console.log(this.info);
};
SubClass.prototype.printInfo = function(){
console.log("calling superclass");
SuperClass.prototype.printInfo.call(this);
console.log("called superclass");
};
@coolscitist
En lugar de
SubClass.prototype.printInfo = function()
{
Object.getPrototypeOf(SubClass.prototype).printInfo.call(this);
};
utilizar esta
SubClass.prototype.printInfo = function()
{
Object.getPrototypeOf(this.constructor.prototype).printInfo.call(this);
};
Para cualquiera que venga más de un mundo Java, ignoraría todo lo anterior y usaría la siguiente sintaxis que se introdujo en 2015.
class Polygon {
constructor(height, width) {
this.height = height;
this.width = width;
}
}
class Square extends Polygon {
constructor(sideLength) {
super(sideLength, sideLength);
}
get area() {
return this.height * this.width;
}
set sideLength(newLength) {
this.height = newLength;
this.width = newLength;
}
}
Más información en https://developer.mozilla.org/en-US/docs/Web/JavaScript/Inheritance_and_the_prototype_chain
Y de repente puedes usar super como palabra clave para acceder a ancester, etc. ... Para mí, encontrar esto fue un gran alivio