require/import a class 已经在继承链的上层导入是错误的吗?

Is it wrong to require/import a class that is already imported higher up the inheritance chain?

我在我的 Node.js 应用程序中使用了一个外部库 (Objection.js)。我创建了一个基础模型 class,它扩展了 Objection 的 Model class 用于我的实体模型:

const { Model } = require('objection')

class ModelBase extends Model {
    // implementation not important for this question
}

在扩展我的基础的模型 classes 中,有时,特别是在编码 relationMappings 时,我必须在 Model 上访问 properties/enumerations基地class。我 可以 在我的扩展模型中这样做:

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 的成员。对我来说更明确和正确的是 import/require 来自 Objection 的 Model 这样我就可以从那里访问 BelongsToOneRelation ,比如:

const { Model } = require('objection')
// other code just like above until the relationMappings...
                relation: Model.BelongsToOneRelation

我更喜欢这种方法。如果我 import/require 一个已经在继承链范围内的 class ,它会导致问题,比如 require 循环或循环依赖的 JavaScript 版本吗?

Will it cause problems, like require loops or the JavaScript version of a circular dependency, if I import/require a class that is already in scope in the inheritance chain?

没有。一个模块将在第一次需要时执行,然后如果执行完成 exports 对象被缓存,并且进一步 require()s 将 return 相同的对象。

如果你有一个循环依赖,其中一个 require() 将 return 在模块执行之前导出对象,所以导出对象届时将为空,但会被填充以后有属性。

因此,即使是循环依赖也可能正常工作,但如果它们失败了,它会让你头疼,所以总是尽量不要引起那个。

I think it is misleading, as .BelongsToOneRelation is NOT a member of ModelBase

实际上是:它是继承成员。

I prefer to explicitly import the superclass and access the member there. Will it cause problems, like require loops or the JavaScript version of a circular dependency?

不,不会。继承层次和范围与你的模块依赖无关。