【问题标题】:Is it wrong to require/import a class that is already imported higher up the inheritance chain?要求/导入一个已经在继承链上层导入的类是错误的吗?
【发布时间】:2019-04-12 16:42:06
【问题描述】:

我有一个在我的 Node.js 应用程序中使用的外部库 (Objection.js)。我为我的实体模型创建了一个扩展 Objection 的 Model 类的基本模型类:

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

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

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

【问题讨论】:

  • 不,不会造成问题。 “已经在继承链的范围内”不是一回事,范围和继承是完全分开的。
  • 好的,谢谢,既然你回答了,我应该删除我的问题吗?
  • 经验法则:如果你认为其他人会有同样的问题,你可以留下来,否则删除是安全的。

标签: javascript inheritance objection.js


【解决方案1】:

如果我导入/需要一个已经在继承链范围内的类,它会导致问题,例如需要循环或循环依赖的 JavaScript 版本吗?

没有。第一次需要时会执行一个模块,然后如果执行完成,exports 对象会被缓存,然后require()s 将返回相同的对象。

如果您有循环依赖,require()s 之一将在模块执行之前返回导出对象,因此导出对象届时将为空,但稍后将被属性填充。

因此,即使是循环依赖也可能正常工作,但如果它们失败了,就会让您头疼,所以请始终尽量不要导致这种情况。

【讨论】:

    【解决方案2】:

    我认为这是一种误导,因为.BelongsToOneRelation 不是ModelBase 的成员

    其实是:它是一个继承的成员。

    我更喜欢显式导入超类并访问那里的成员。会不会导致问题,比如 require 循环或循环依赖的 JavaScript 版本?

    不,不会。继承层次结构和范围与您的模块依赖关系无关。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-19
      • 2015-03-25
      • 1970-01-01
      • 2021-05-16
      • 1970-01-01
      • 2021-12-12
      • 2016-02-28
      • 1970-01-01
      相关资源
      最近更新 更多