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?
不,不会。继承层次和范围与你的模块依赖无关。
我在我的 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 ofModelBase
实际上是:它是继承成员。
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?
不,不会。继承层次和范围与你的模块依赖无关。