3
votes

Appel de la fonction grand-parent en javascript

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;


3 commentaires

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


4 Réponses :


-3
votes

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();


0 commentaires

3
votes

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()


0 commentaires

1
votes

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();


0 commentaires

1
votes

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.


0 commentaires