Bonne façon d'appeler super-classe des fonctions de la sous-classe
J'ai un "super-classe" avec "info" comme une variable d'instance. "Superclasse" a la fonction "printInfo()". "printInfo()" doit accéder à la variable d'instance "info".
Je veux créer une "sous-classe" qui a aussi la méthode "printInfo()". Je veux l'appeler printInfo() de "super-classe" à partir de "printInfo()" de la "sous-classe".
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();
Vous pouvez le constater, je suis de passage "que" en tant que paramètre à printInfo. Sans que "paramètre", "info" est imprimé en tant que "undefined". Comme dans le cas suivant, "this.info" n'est pas définie lorsque cette fonction est appelée à partir de l'objet de la "sous-classe".
SuperClass.prototype.printInfo = function()
{
console.log("printing from superclass printInfo");
console.log(this.info);
};
Quelle est la bonne façon de remplacer et appeler des méthodes de la super-classe en javascript, permettant à des fonctions pour accéder aux variables d'instance de la classe?
- double possible de Javascript Héritage de Classe Pour les Fonctions
- et vous devriez aussi obtenir votre constructeur héritage correct
Vous devez vous connecter pour publier un commentaire.
Vous êtes de jouer avec le
SubClass
s'prototype avec l'SuperClass
s'objet, dans cette lignede l'enfant prototype doit dépendre de la Mère du prototype. Donc, vous pouvez hériter comme ce
Aussi, il est tout à fait normal de modifier le constructeur de la fonction elle-même, comme ce
De conserver votre mise en œuvre générique, vous pouvez utiliser
de l'Objet.getPrototypeOf
, pour obtenir le parent prototype dans la chaîne d'héritage et ensuite invoquerprintInfo
, à l'instar de ceDepuis,
info
est définie dans leSubClass
pourtant, il va imprimerundefined
. Vous pouvez également appeler le parent pas de constructeur, à l'instar de ceRemarque: Vous êtes à la création de variables globales, en omettant
var
mot-clé avant deSuperClass
etSubClass
.Subclass.printInfo()
àSuperclass.printInfo()
êtreObject.getPrototypeOf(SubClass.prototype).printInfo.call(this)
plutôt que de simplement...printInfo(this)?
je demande parce que je l'ai essayé votre chemin et vous avez une erreur à propos deundefined
. Je ne suis pas un expert JS, donc il n'est pas clair pour moi pourquoi de toute façon serait de travailler ou ne pas travailler.Object.getPrototypeOf(Object.getPrototypeOf(this))
..call(this)
de sorte quethis
à l'intérieur de la méthode appelée sera la même que l'intérieur de la méthode appelante.Après avoir lu toutes les réponses, je suis en utilisant le suivant mécanisme d'héritage:
Vous pouvez l'écrire comme ceci :
@coolscitist
Au lieu de
utiliser cette
Class3
hériter deSubClass
, appelantClass3
's printInfo() va provoquer une boucle infinie. C'est parce que lethis.constructor
ci-dessus donnera toujoursClass3
au lieu deSubClass
, c'est à dire l'appel de printInfo fonction deClass3
's super-classe (sous-classe) encore & encore une fois.Pour quelqu'un qui vient d'un monde Java, je voudrais ignorer tous les ci-dessus et utilisez la syntaxe suivante à la place qui a été introduit en 2015
Plus d'infos sur https://developer.mozilla.org/en-US/docs/Web/JavaScript/Inheritance_and_the_prototype_chain
Et soudainement u peut utiliser super comme mot-clé pour accéder ancêtre etc.... Pour moi, trouver cet a été un grand soulagement
super
ne peut être utilisé dans le constructeur.