通常,您想要not有这样的循环依赖。
在最好的情况下,循环依赖会破坏一切并且不会编译(或转译)。
在最糟糕的情况下,循环依赖会导致合并和版本控制冲突,导致代码很难辨别,看起来它们工作得很好,直到它们停止,并出现一些由一些可怕的状态假设引起的可怕错误。
你的解决方案(如果你对这种继承形式死心塌地)将是提取Car
到它自己的文件/类中,可以单独导入,并使工厂与类分开。
这在英语中是完全有道理的。
汽车不生产雷克萨斯(Lexi?)。
此外,如果您did想要保留这个(不是一个好主意),那么你应该有一个注册方法,而不是一个硬编码的解决方案,你可以注册“雷克萨斯”和制作新雷克萨斯的函数。
import Car from "./car";
class Lexus extends Car {
constructor () {
super("Lexus");
}
// starting to look like a bad idea
static make () {
return Car.make("Lexus");
}
// starting to look worse
static register () {
/* this register method does nothing, so that Lexus can't make other cars... */
}
}
Car.register("Lexus", () => new Lexus());
export default Lexus;
情况变得更糟,但这已经很糟糕了。
如果你走另一条路:
// carfactory.js
const carTypes = new Map();
class CarFactory {
static register (name, implementation) {
carTypes.set(name, implementation);
return CarFactory;
}
static make (name) {
const makeCar = carTypes.get(name);
return makeCar();
}
register (name, implementation) {
CarFactory.register(name, implementation);
return this;
}
make (name) { return CarFactory.make(name); }
}
export default CarFactory;
// index.js
import Car from "./classes/car";
import Lexus from "./classes/lexus";
import CarFactory from "./factories/car";
CarFactory
.register("Lexus", () => new Lexus())
.register("Bentley", () => new Bentley());
init( CarFactory );
function init (Car) {
const lexus = Car.make("Lexus");
}
现在,任何班级都不需要知道他们不应该知道的事情。