首页 > 解决方案 > 通过 - node.js - awilix 模块向从父级扩展的类启动参数

问题描述

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

Thec 子类是通过使用 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
    }

}

扩展类

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)

标签: javascriptnode.jsoopkoa

解决方案


一般来说,在 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
    }

}

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

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

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

如果您是 BaseClass 的作者,您可能希望提取它的一些特性以通过注入使它们可用。并在 BaseClass 和 extendedClass 中注入所需的特性。


推荐阅读