ES6模块和继承

kor*_*inp 9 javascript inheritance ecmascript-6

我有以下JavaScript文件:

SRC/JS /班/ Lexus.js:

import {Car} from 'src/js/classes/Car';

export class Lexus extends Car {
  constructor() {
    super("Lexus");
  }
}
Run Code Online (Sandbox Code Playgroud)

SRC/JS /班/ Mercedes.js:

import {Car} from 'src/js/classes/Car';

export class Mercedes extends Car {
  constructor() {
    super("Mercedes");
  }
}
Run Code Online (Sandbox Code Playgroud)

SRC/JS /班/ Car.js:

import {Lexus} from 'src/js/classes/Lexus'; //either of those imports works, but not both!
import {Mercedes} from 'src/js/classes/Mercedes'; //either of those imports works, but not both!

export class Car {
  constructor(make) {
    this.make = make;
  }

  static factory(msg) {
    switch(msg) {
      case "Lexus":
        return new Lexus();
      case "Mercedes":
        return new Mercedes();
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

和app.js:

import {Lexus} from 'src/js/classes/Lexus';
import {Mercedes} from 'src/js/classes/Mercedes';
import {Car} from 'src/js/classes/Car';

var car = Car.factory("Lexus");
console.log(car);
Run Code Online (Sandbox Code Playgroud)

有趣的东西,如果我输入任何 LexusMercedes到汽车类和调用app.js工厂方法-一切正常; 但是,如果我导入两个 LexusMercedesCar类,我得到一个错误:

超级表达式必须为null或函数,而不是未定义

我错过了什么?

Nor*_*ard 5

通常情况下,你想具有循环依赖这样的.在最好的时候循环依赖,打破一切,不编译(或转换).在最糟糕的时候循环依赖,导致合并和版本冲突,导致代码很难辨别,看起来他们工作正常,直到他们停止,由一些可怕的状态假设引起的一些可怕的错误.

你的解决方案(如果你在这种继承形式上死定)将被提取Car到它自己的文件/类中,它可以单独导入,并使Factory与类分开.

其中,用英语完全有道理.
汽车不构建雷克萨斯(Lexi?).

另外,如果你确实想保留这个(不是一个好主意),那么你应该有一个寄存器方法,而不是硬编码的解决方案,你可以注册"雷克萨斯"和制造新雷克萨斯的功能.

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;
Run Code Online (Sandbox Code Playgroud)

情况变得更糟,但这已经很糟糕了.

如果你走另一条路线:

// 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");
}
Run Code Online (Sandbox Code Playgroud)

现在,没有班级需要了解他们不应该拥有的东西.