Вызов родительской функции в javascript

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

class GrandParent{
  funcA(){
    console.info('GrandParent');
  }
}
class Parent extends GrandParent{
  funcA(){
    console.info('Parent');
  }
}
class Child extends Parent{
  funcA(){
    console.info('Child');
    // how to call funcA of GrandParent -> super.super.funcA()
  }
}

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

Child

GrandParent

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

Спасибо;

Вы можете вызвать это над суперфункцией

Rafv 29.01.2019 08:23

Если я это сделаю, я вызову Parent.funcA(), я хочу вызвать GrandParent.func(A)

Alberto Valero 29.01.2019 08:24

Так что, я думаю, нет прямого пути. Спасибо

Alberto Valero 30.01.2019 09:10
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
3
3
1 151
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Позвонить можно через new GrandParent().funcA();

class GrandParent {
  funcA() {
    console.info('GrandParent');
  }
}
class Parent extends GrandParent {
  funcA() {
    console.info('Parent');
  }
}
class Child extends Parent {
  funcA() {
    console.info('Child');
    new GrandParent().funcA();
  }
}

const child = new Child();
child.funcA();

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

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

class GrandParent {
  doStuff() {
    console.info('some stuff')
  }

  funcA() {
    this.doStuff()
    console.info('GrandParent')
  }
}

class Parent extends GrandParent {
  funcA() {
    console.info('Parent')
  }
}

class Child extends Parent {
  funcA() {
    this.doStuff()
    console.info('child')
  }
}

const child = new Child()
child.funcA()

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

class GrandParent{
  funcA(){
    console.info('GrandParent');
  }
}
class Parent extends GrandParent{
  funcA(){
    console.info('Parent');
    super.funcA();
  }
}
class Child extends Parent{
  funcA(){
    console.info('Child');
    super.funcA();

  }
}

var x = new Child();
x.funcA();

Если вы действительно хотите использовать ключевое слово super, это возможно, но вам нужно будет указать соответствующий прототип. Другими словами, вы должны пройти по цепочке объектов __proto__ вручную.

class Level1 {
  me() { console.info('Level1'); }
}

class Level2 extends Level1 {
  me() { console.info('Level2'); }
}

class Level3 extends Level2 {
  me() { 
    super.__proto__.__proto__.__proto__.me();
    //      ^         ^         ^ reference to Level1 prototype
    //      |         | reference to Level2 prototype 
    //      | reference to Level3 prototype
    console.info('Level3'); 
  }
}

const foo = new Level3();
foo.me();

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

Другие вопросы по теме