javascript - 无法创建由继承自多个类的类组成的 AngularJS 服务

标签 javascript angularjs inheritance

背景:我正在开发一个 Angular 1.x 项目,该项目本身与一些 AWS 服务相集成。我为我使用的每个 DynamoDB 表提供了一项服务,用于管理基本操作,如放置、查询、获取、更新等。然后将这些服务导入到“主”服务中,该服务添加了一些更复杂的功能(如读取一个表并插入到另一个表中)。在表类中,我有“私有(private)”函数(我认得它们,因为它们都以“_”开头)和公共(public)函数。一般服务使用两者。每个服务都有 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 Controller 中,而不是所有“表”服务,因此我的目标是实现多类继承,其中我的主要服务继承自所有表服务并公开它们的所有方法(公共(public)和私有(private),我不在乎),因此在我的 Controller 中我只导入我的主要服务并且我拥有我需要的一切。

我找到的一些解决方案:我在这里阅读了一些类似的问题,但没有一个答案适合我的情况,因为我需要将不同的变量传递到我的表服务的构造函数中。我不想使用任何使多重继承更容易的外部库,因为项目会很大,我不想继续添加东西,所以我想自己实现它。
我得到的最好的想法是创建子类的实例,使用 Object.getPrototypeOf 获取它们的原型(prototype)。 , 并将 this 的原型(prototype)设置为 Object.setPrototypeOf与他们一起通过Object.assign ,像这样:

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 行返回 {},我不明白为什么。

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

因此,如果你们中有人知道此方法失败的原因或过去遇到过此问题,我将非常感谢您的帮助。

提前致谢!

最佳答案

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

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

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 实例,而是通过依赖注入(inject)将它们传入。


至于为什么您的“多重继承”解决方案不起作用:Object.assign 调用仅从原型(prototype)复制字段,而不是在对象本身上设置的字段。它也不会沿着原型(prototype)链上升,所以它也不会从父类复制任何东西。一个简单的 for (prop in obj) 循环应该有助于捕获所有内容。

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

关于javascript - 无法创建由继承自多个类的类组成的 AngularJS 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48146330/

相关文章:

javascript - 通过公共(public)属性绑定(bind)指令实例

java - Angular js : How to pass "." character into a parameter for $resource

java - 如果我打算覆盖所有方法,使用继承是不是不好的做法?

java - 如何调用Parent重写方法

javascript - 如何在我的 Web View Android 应用程序中使用 Polymer 项目

javascript - 如何首先在应用程序模板中加载 Ember 组件?

javascript - 复制一个 HTML 表中的所有行并附加到另一表

javascript - 将 JS 对象转换为具有父名称的平面数组

angularjs - Bootstrap 3 导航栏固定顶部与内容重叠

Python:如何用最少的代码扩展一个巨大的类?