【问题标题】:Use all functions of another object in javascript在javascript中使用另一个对象的所有功能
【发布时间】:2018-12-26 16:24:08
【问题描述】:

我找不到此问题的解决方案。我整天都在用头撞墙。

假设我们有以下类的层次结构:

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() 的方式组合对象的原型,而无需像上面那样编写重复的代码。绝对必须能够在类外部的对象 D 上直接调用 group(),即使它是 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 的实例。这是为什么?我怎样才能实现它,而不像第一个示例那样编写重复的代码?

【问题讨论】:

标签: javascript function oop prototype


【解决方案1】:

可以做的,就是赋值给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();

无论如何,在您的情况下,我会进行组合(就像您在 D 中使用 C 所做的那样),然后调用如下方法:

d.c.group()

这使您可以避免 appendPrototype 逻辑。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-02
    • 1970-01-01
    • 2018-03-30
    • 2012-05-05
    • 2023-03-03
    • 1970-01-01
    • 2016-02-22
    • 2021-10-27
    相关资源
    最近更新 更多