Module 如何使用工厂函数解决ES6模块中的循环依赖关系?
我想在我的Module 如何使用工厂函数解决ES6模块中的循环依赖关系?,module,ecmascript-6,factory,Module,Ecmascript 6,Factory,我想在我的src/core/Chessman.js文件中写一些类似的东西: import King from './chessmen/King' class Chessman { static factory(side, quality) { switch(quality) { case 'king' : return new King(side) break // ... other qualities } constructor(sid
src/core/Chessman.js文件中写一些类似的东西:
import King from './chessmen/King'
class Chessman {
static factory(side, quality) {
switch(quality) {
case 'king' : return new King(side) break
// ... other qualities
}
constructor(side) { this.side = side }
cast(position, ref) { }
run(position, startRef, endRef) {}
}
import Chessman from '../Chessman'
class King extends Chessman {
constructor(side) {
super(side)
this.iterative = false // true for Queens, Rooks and Bishop
this.directions = [
'up', 'up+right', 'right', 'right+down',
'down', 'down+left', 'left', 'left+top'
]
}
// overrides parent behavior
cast(position, ref) {}
run(position, startRef, endRef) {}
}
在我的src/core/chessmen/King.js文件中:
import King from './chessmen/King'
class Chessman {
static factory(side, quality) {
switch(quality) {
case 'king' : return new King(side) break
// ... other qualities
}
constructor(side) { this.side = side }
cast(position, ref) { }
run(position, startRef, endRef) {}
}
import Chessman from '../Chessman'
class King extends Chessman {
constructor(side) {
super(side)
this.iterative = false // true for Queens, Rooks and Bishop
this.directions = [
'up', 'up+right', 'right', 'right+down',
'down', 'down+left', 'left', 'left+top'
]
}
// overrides parent behavior
cast(position, ref) {}
run(position, startRef, endRef) {}
}
但可悲的是,我(在测试时)用Karma、jasmine和babel得到了错误
TypeError:超级表达式必须为null或函数,而不是未定义的
在src/core/chessmen/King.js:57
现在在King.js
中没有第57行 您有一个循环依赖项错误。鉴于你所展示给我们的,考虑以下步骤:
Chessman.js
开始加载
它暂停执行,以便加载其依赖项
King.js
开始加载,因为它是一个依赖项
King.js
抛出,因为类King扩展了Chessman
运行,但是Chessman
尚未设置,因为它在步骤2暂停
最好将工厂函数移到自己的文件中,以避免周期性依赖。JS中唯一安全的循环依赖项是在初始化模块本身时不需要的依赖项。由于类扩展X
在模块初始化时运行,因此循环不安全
如果这确实是您唯一的类,那么您可以编写应用程序,使King.js
在Chessman.js
之前被导入,但是考虑到您使用的工厂和命名方案,我假设还有其他棋子。由于每个棋子类都会触发此问题,因此无法按正确顺序导入它们。通过将工厂函数移出Chessman.js来避免此问题是唯一的解决方案。您有一个循环依赖性错误。鉴于你所展示给我们的,考虑以下步骤:
Chessman.js
开始加载
它暂停执行,以便加载其依赖项
King.js
开始加载,因为它是一个依赖项
King.js
抛出,因为类King扩展了Chessman
运行,但是Chessman
尚未设置,因为它在步骤2暂停
最好将工厂函数移到自己的文件中,以避免周期性依赖。JS中唯一安全的循环依赖项是在初始化模块本身时不需要的依赖项。由于类扩展X
在模块初始化时运行,因此循环不安全
如果这确实是您唯一的类,那么您可以编写应用程序,使King.js
在Chessman.js
之前被导入,但是考虑到您使用的工厂和命名方案,我假设还有其他棋子。由于每个棋子类都会触发此问题,因此无法按正确顺序导入它们。通过将工厂函数移出Chessman.js来避免此问题是唯一的解决方案。如果您想拥有工厂,而不是将其直接保存在基类模块中,请将其移动到自己的模块-Chessman.factory.js
。在那里,做任何Chessman.factory
在方法或某事中所做的事情。这样,chessman.js
模块就不必知道需要自己的模块,如果您想要一个工厂,而不是直接将其保存在基类模块中,则将其移动到自己的模块-chessman.factory.js
。在那里,做任何Chessman.factory
在方法或某事中所做的事情。这样,chessman.js
模块就不必知道需要自己的模块了,Nice!是的,还有其他的棋子。。。因此,我将把工厂转移到它自己的模块。谢谢大家!美好的是的,还有其他的棋子。。。因此,我将把工厂转移到它自己的模块。谢谢大家!最后,我选择了明确的关注点:基本上,对于国王来说,有三个文件:./core/Chessman.js、./chessmen/king.js和./factories/chessmen.js。。。现在一切都好了。最后,我选择明确表达我的担忧:基本上,对于国王来说,有三个文件:./core/Chessman.js、./chessmen/king.js和。/factories/chessmen.js。。。现在一切都好了。