Вызов функции прародителя в JavaScript - PullRequest
0 голосов
/ 29 января 2019

Я получаю эту структуру наследования классов:

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

Вопрос: как я могу вызвать GrandParent.funcA () из Child.funcA ()?

Child

GrandParent

Должен быть зарегистрирован на консоли.

Спасибо;

Ответы [ 4 ]

0 голосов
/ 14 августа 2019

Если вы действительно хотите использовать ключевое слово super, это возможно, но вам нужно указать на соответствующий прототип.Другими словами, вы должны вручную пройти через __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();

Но, как было сказано ранее, возможно, стоит пересмотреть логику, чтобы избежать такой структуры в вашем коде.

0 голосов
/ 29 января 2019

Это противоречиво: вы переопределили GranParent.funcA новой реализацией.Если вам нужно то, что делает GranParent.funcA, возможно, вам придется немного разложить код и переопределить Child.funcA по мере необходимости в зависимости от вашего фактического варианта использования.

Воспользуйтесь преимуществами полиморфизма:

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 голосов
/ 29 января 2019

Если вы хотите получить функцию, используя ключевое слово super.Вам нужно вызвать super в родительской функции, чтобы указать funcA в классе Grandparent.

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 голосов
/ 29 января 2019

Вы можете позвонить через 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();
...