Используйте все функции другого объекта в JavaScript - PullRequest
0 голосов
/ 26 декабря 2018

Я не смог найти решение этой проблемы.Я бьюсь головой об стену весь день.

Предположим, у нас есть следующая иерархия классов:

class A {
    async name() { ... } 
}
class B extends A {
    async age() { ... }
}
class C extends A {
    async group() { ... }
}

class D extends B {
    constructor() {
         super(...)
         this.C = new C(...);
    }
    async group() { return await this.C.group(); }
}

Поскольку JavaScript не поддерживает множественное наследование, у меня есть проблема.Я хотел бы объединить прототипы объектов таким образом, чтобы я мог вызывать функцию group() без необходимости написания повторяющегося кода, как описано выше.Абсолютно необходимо иметь возможность вызывать group() непосредственно на объекте D вне класса, даже если это экземпляр class C.

Как я могу объединить их прототипы?Я пробовал что-то вроде

class A {
  appendPrototype(obj) { 
    if (obj instanceof A)
        for (let k in obj.__proto__) {
            this.__proto__[k] = obj.__proto__[k];
        }
   }
} 
.
.
. // Same two classes, B and C
class D extends B {
    constructor(...) {
        super(...);
        const c = new C(...);
        this.appendPrototype(c);
    }
}

Я не могу вызвать функцию group() экземпляр class D.Это почему?Как я могу достичь этого, без написания повторяющегося кода, как в первом примере?

1 Ответ

0 голосов
/ 27 декабря 2018

Что вы можете сделать, это присвоить прототипу класса D метод класса C. Таким образом, все экземпляры D будут иметь метод group, который является тем же методом, который определен вкласс C, и вы можете сделать то же самое для всех других дочерних классов.

class A {
  async name() {
    console.log('A - name');
  } 
}
class B extends A {
  async age() {
    console.log('B - age');
  }
}
class C extends A {
  async group() {
    console.log('C - group');
  }
}

class D extends B {
  constructor() {
    super();
  }
}
D.prototype.group = C.prototype.group;

const d = new D(); 
d.group();

В любом случае, в вашем случае я бы пошел на композицию (как вы сделали с C внутри D), а затем вызвал бы такие методы, как:

d.c.group()

, что позволяет вам избежать логики appendPrototype.

...