我有一个在Node.js应用程序中使用的外部库(Objection.js)。我创建了一个基础模型类,Model为我的实体模型扩展了Objection的类:const { Model } = require('objection')class ModelBase extends Model { // implementation not important for this question}在扩展基础的模型类中,有时,尤其是在对进行编码时relationMappings,我必须访问Model基础类上的属性/枚举。我可以在这样的扩展模型中做到这一点:const ModelBase = require('./model-base')class SomeModel extends ModelBase { static get relationMappings () { const SomeOtherModel = require('./some-other-model') return { someOtherModel: { relation: ModelBase.BelongsToOneRelation, modelClass: SomeOtherModel, // etc. } } }}注意这一relation: ModelBase.BelongsToOneRelation行。这行得通,但我认为这具有误导性,因为BelongsToOneRelation它不是的成员ModelBase。在我看来,更明确,更正确的方法是Model从Objection导入/请求from,以便我可以BelongsToOneRelation从那里访问该对象,例如:const { Model } = require('objection')// other code just like above until the relationMappings... relation: Model.BelongsToOneRelation我更喜欢这种方法。如果导入/需要继承链中已经存在的类,是否会引起问题,例如require循环或循环依赖的JavaScript版本?
2 回答
RISEBY
TA贡献1856条经验 获得超5个赞
如果导入/需要继承链中已经存在的类,是否会引起问题,例如require循环或循环依赖的JavaScript版本?
不会。模块将在首次需要时执行,然后如果执行完成,则exports
对象将被缓存,并且进一步require()
s将返回相同的对象。
如果具有循环依赖关系,则require()
s之一将在模块执行之前返回导出对象,因此导出对象届时将为空,但稍后将用属性填充。
因此,即使循环依赖项也可能正常工作,但是如果失败,则会使您头疼,因此请务必尽量避免这种情况。
白猪掌柜的
TA贡献1893条经验 获得超10个赞
我认为这具有误导性,因为
.BelongsToOneRelation
它不是ModelBase
实际上是:它是一个继承的成员。
我更喜欢显式导入超类并在那里访问成员。是否会引起问题,例如require循环或循环依赖项的JavaScript版本?
不,不会。继承层次结构和范围与模块依赖性无关。
添加回答
举报
0/150
提交
取消