J'obtiens cette structure d'héritage de classe:
class GrandParent{ funcA(){ console.log('GrandParent'); } } class Parent extends GrandParent{ funcA(){ console.log('Parent'); } } class Child extends Parent{ funcA(){ console.log('Child'); // how to call funcA of GrandParent -> super.super.funcA() } }
La question est: comment puis-je appeler GrandParent.funcA () depuis Child.funcA ()?
Enfant
GrandParent
Doit être connecté à la console.
Merci;
4 Réponses :
Vous pouvez l'appeler via new GrandParent (). funcA ();
class GrandParent { funcA() { console.log('GrandParent'); } } class Parent extends GrandParent { funcA() { console.log('Parent'); } } class Child extends Parent { funcA() { console.log('Child'); new GrandParent().funcA(); } } const child = new Child(); child.funcA();
C'est contradictoire: vous avez remplacé GranParent.funcA
par une nouvelle implémentation. Si vous avez besoin de ce que fait GranParent.funcA
, vous devrez probablement décomposer un peu votre code et remplacer Child.funcA
si nécessaire en fonction de votre cas d'utilisation réel. Tirez parti du polymorphisme:
class GrandParent { doStuff() { console.log('some stuff') } funcA() { this.doStuff() console.log('GrandParent') } } class Parent extends GrandParent { funcA() { console.log('Parent') } } class Child extends Parent { funcA() { this.doStuff() console.log('child') } } const child = new Child() child.funcA()
Si vous souhaitez obtenir la fonction en utilisant le mot clé super. Vous devez appeler la fonction super in parent pour pointer la fonction funcA dans la classe Grand-parent.
class GrandParent{ funcA(){ console.log('GrandParent'); } } class Parent extends GrandParent{ funcA(){ console.log('Parent'); super.funcA(); } } class Child extends Parent{ funcA(){ console.log('Child'); super.funcA(); } } var x = new Child(); x.funcA();
Si vous voulez réellement utiliser le mot-clé super
, c'est possible, mais vous devrez pointer vers le prototype approprié. En d'autres termes, vous devez parcourir manuellement la chaîne d'objets __proto__
.
class Level1 { me() { console.log('Level1'); } } class Level2 extends Level1 { me() { console.log('Level2'); } } class Level3 extends Level2 { me() { super.__proto__.__proto__.__proto__.me(); // ^ ^ ^ reference to Level1 prototype // | | reference to Level2 prototype // | reference to Level3 prototype console.log('Level3'); } } const foo = new Level3(); foo.me();
Mais comme cela a déjà été dit, il vaut probablement la peine de repenser la logique pour éviter une telle structure dans votre code.
Vous pouvez l'appeler par super fonction
Si je fais cela, j'appelle Parent.funcA (), je veux appeler GrandParent.func (A)
Donc, je suppose qu'il n'y a pas de moyen simple. Merci