无法创建由继承自多个类

时间:2018-01-08 08:05:43

标签: javascript angularjs inheritance

背景:我正在开发一个与一些AWS服务集成的Angular 1.x项目。我为每个使用的DynamoDB表提供服务,管理put,query,get,update等基本操作。然后将这些服务导入“主”服务,增加一些更复杂的功能(如从一张桌子并插入另一张桌子)。在表类中,我有两个“私有”函数(我认识它们,因为它们都以“_”开头)和公共。一般服务使用两者。每个服务都有ES6类语法,因此我的表类将如下所示:

export default class {
    constructor(some, var, and, const) {
        this.some = some;
        this.var = var;
        this.and = and;
        this.const = const;
        ...
    }

    _myPrivateMethod() {
        console.log(`I'm private!`);
    }

    myPublicMethod() {
        console.log(`I'm public!`);
    }
}

问题:我希望能够只将主服务导出到我的Angular控制器中,而不是所有的“表”服务,所以我的目标是实现多类继承,其中我的主服务继承了所有的表服务并公开了他们的所有方法(公共和私有,我不在乎),所以在我的控制器中我只导入我的主服务,我有我需要的一切。

我发现了一些解决方案:我在这里读了一些类似的问题,但没有一个答案适合我的情况,因为我需要将不同的变量传递给我的表服务的构造函数。我不想使用任何更容易进行多重继承的外部库,因为项目很大,我不想继续添加东西,所以我想自己实现它。
我所拥有的最好的想法包括创建子类的实例,使用Object.getPrototypeOf获取原型,并使用Object.setPrototypeOfthis的原型设置为Object.assign通过{{ 3}},像这样:

import TableClass1 from './tables/1';
import TableClass2 from './tables/2';

export default class MyMainClass {
    constructor(some, var, other, param) {
        let myTableInstance1 = new TableClass1(some, var);
        let myTableInstance2 = new TableClass2(other, param);
        let tmpMultiInherit = Object.assign({}, Object.getPrototypeOf(myTableInstance1), Object.getPrototypeOf(myTableInstance2));

        Object.setPrototypeOf(this, tmpMultiInherit);
    }
}

这对我来说似乎是一个好主意,因为getPrototypeOf(s)函数正确地返回了我需要在object类型中添加到我的类中的内容,但Object.assign行返回{{1我无法理解为什么。

This问题是我发现的最有用的问题,但没有一个答案解释了如何用不同的父类的构造函数形式实现多重继承。

所以,如果你们中的任何一个人知道为什么这种方法失败或者过去遇到过这个问题,我将非常感谢你的帮助。

提前谢谢!

1 个答案:

答案 0 :(得分:1)

为什么首先需要多重继承?几乎所有问题都可以在没有继承的情况下得到更好的解决,并且绝对没有多重继承带来的麻烦。

在这种情况下,为什么不创建一个组成这些表类的服务,而不是从所有这些表继承(组合而不是继承)?

import TableClass1 from './tables/1';
import TableClass2 from './tables/2';

export default class MyMainClass {
    constructor(some, var, other, param) {
        this.table1 = new TableClass1(some, var);
        this.table2 = new TableClass2(other, param);
    }
}

编写起来更容易,调试更容易,也更容易测试。特别是如果不是在构造函数中创建new TableClass1实例,而是通过依赖注入传递它们。

至于为什么你的“多重继承”解决方案不起作用:Object.assign调用仅复制原型中的字段,但不复制对象本身上设置的字段。它也不会上升到原型链,因此它也不会复制父类中的任何内容。一个简单的for (prop in obj)循环应该有助于捕捉所有内容。

仍然需要非常小心,因为任何捕获的this指针仍将指向原始的myTableInstance1myTableInstance2对象,并最终做错了非常不明显的方式。总的来说,这闻起来像是微妙的,难以发现的错误的来源,我强烈建议不要采用这种方法。