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。。。现在一切都好了。