【发布时间】:2018-01-08 08:05:43
【问题描述】:
背景:我正在开发一个将自身与一些 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.assign 将this 的原型设置为Object.setPrototypeOf 与所有它们,如下所示:
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) 函数返回的正是我需要在 typeof object 中添加到我的类的内容,但 Object.assign 行返回 {},我不能明白为什么。
This 问题是我发现的最有用的问题,但没有一个答案能解释如何使用不同父类的构造函数形式实现多继承。
因此,如果你们中的任何人知道为什么此方法失败或过去曾遇到过此问题,我将非常感谢您的帮助。
提前谢谢你!
【问题讨论】:
标签: javascript angularjs inheritance