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)
有趣的东西,如果我输入任何 Lexus或Mercedes到汽车类和调用app.js工厂方法-一切正常; 但是,如果我导入两个 Lexus和MercedesCar类,我得到一个错误:
超级表达式必须为null或函数,而不是未定义
我错过了什么?
通常情况下,你想不具有循环依赖这样的.在最好的时候循环依赖,打破一切,不编译(或转换).在最糟糕的时候循环依赖,导致合并和版本冲突,导致代码很难辨别,看起来他们工作正常,直到他们停止,由一些可怕的状态假设引起的一些可怕的错误.
你的解决方案(如果你在这种继承形式上死定)将被提取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)
现在,没有班级需要了解他们不应该拥有的东西.
| 归档时间: |
|
| 查看次数: |
2880 次 |
| 最近记录: |