Я получаю эту структуру наследования классов:
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
Должен быть зарегистрирован на консоли.
Спасибо;
Если я это сделаю, я вызову Parent.funcA(), я хочу вызвать GrandParent.func(A)
Так что, я думаю, нет прямого пути. Спасибо



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Позвонить можно через 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();Но, как было сказано ранее, возможно, стоит переосмыслить логику, чтобы избежать такой структуры в вашем коде.
Вы можете вызвать это над суперфункцией