javascript - 通过 -node.js - awilix 模块启动从父级扩展的类的参数

标签 javascript node.js oop koa

我想在子类中启动一个参数并在基类中使用它, 我想输入在子构造函数中启动的 this.smth 而无需调用 super() 因为我只需要在父级中使用一些服务

子类是通过awilix使用node.js的DI启动的 父类仅在导入时才存在。 像下面这样:

modulesArr.push(['src/classes/*.js', Lifetime.SINGLETON])
container.loadModules(
    modulesArr,
    {
        formatName: 'camelCase'
    }
)

基类:

export default class BaseClass {

    constructor({aservice, bservice}){
        this.aservice = aservice
    }

    async testFun(){
       return this.testvar
    }

}

扩展类(class)

import BaseClass from './base/base.class'
export default class ExtendedClass extends BaseClass {

    constructor(){
        super()
        this.testVar = "smth"

    }

    async testFun(){
       return this.testvar
    }

}

但是后来我收到了一个错误,因为我没有将 aservice 和 bservice 发送到 super(aservice,bservice)

最佳答案

一般来说,在 OOP 中,当您扩展没有默认构造函数(即没有任何参数的构造函数)的类时,并且如果您重新定义构造函数,则必须使用预期的参数调用基构造函数:

import BaseClass from './base/base.class'
export default class ExtendedClass extends BaseClass {

    constructor({aservice, bservice}){
        super({aservice, bservice})
        this.testVar = "smth"

    }

    async testFun(){
       return this.testvar
    }

}

或者:

import BaseClass from './base/base.class'
export default class ExtendedClass extends BaseClass {

    constructor(){
        super({aservice: <something>, bservice: <something>})
        this.testVar = "smth"

    }

    async testFun(){
       return this.testvar
    }

}

在普通 javascript(和 es6)中只能有一个构造函数,并且适用相同的规则。

如果你做不到这一点,换句话说,如果你不能遵守基类的契约,那就表明扩展这个类不是你想要做的。

查看composition模式(将 BaseClass 的实例作为 ExtendedClass 的成员并调用它的方法)

如果您是 BaseClass 的作者,您可能希望提取它的一些功能以使其可用 injection 。并在 BaseClass 和 ExtendedClass 中注入(inject)所需的功能。

关于javascript - 通过 -node.js - awilix 模块启动从父级扩展的类的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51916368/

相关文章:

javascript - 使用 jQuery 显示/隐藏循环中生成的具有特定类和 id 的表行

javascript - Angularjs 在集合中使用 Rowspan

javascript - 仅当元素未获得焦点时才执行函数

node.js - NodeJS : ENAMETOOLONG, 多长时间才算太长?

node.js - 抓取 Fandango Node.js

javascript - 在 Node.js 中加载无 js 的外部文件

php - 改变对象方法结果的方法

javascript - 在 Plone 的 registry.xml 中禁用 CSS/JS 的合并

php - 命名空间作为php函数中的参数

c - C怎么不是面向对象的?