我想在子类中启动一个参数并在基类中使用它, 我想输入在子构造函数中启动的 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/