variable sirve que para objetos herencia comando clases javascript inheritance prototypal-inheritance

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