ES6 模块和继承

2024-01-04

我有以下 JavaScript 文件:

src/js/classes/Lexus.js:

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

export class Lexus extends Car {
  constructor() {
    super("Lexus");
  }
}

src/js/classes/Mercedes.js:

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

export class Mercedes extends Car {
  constructor() {
    super("Mercedes");
  }
}

src/js/classes/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();
    }
  }
}

和应用程序.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);

有趣的是,如果我导入either Lexus or Mercedes到 Car 类并调用 app.js 中的工厂方法 - 一切正常;但是如果我导入both Lexus and Mercedes对于 Car 类,我收到错误:

超级表达式必须为 null 或函数,不能为 undefined

我想念什么?


通常,您想要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");
}

现在,任何班级都不需要知道他们不应该知道的事情。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ES6 模块和继承 的相关文章

随机推荐

  • Android 在托管热点时查找设备的 IP 地址

    当设备托管热点时 我需要找到设备的 IP 地址 到目前为止我已经使用过这段代码 if is using Hotspot for Enumeration
  • 通过引入 T 常量将 Expression> 转换为 Expression>

    我有一个格式为的表达式Expression
  • Crontab 突然停止在服务器上工作?

    我在 Linux 平台上的服务器上设置了一些 crontab 在那 2 天之前 所有 cron 都在运行 我不知道 crontab 发生了什么 它们现在不工作 所有 cron 之前都在运行 之后我添加了一个新的 crontab 它们没有运行
  • HttpWebRequest 对象的诊断转储

    有没有什么好方法 除了繁琐地查询每个属性之外 在 C 中为 HttpWebRequest 构建诊断转储字符串 对于简单的对象 人们可以使用new JObject theObject 但这不适用于 HttpWebRequest 并且toStr
  • 使用 url 创建 yii2 动态页面:www.example.com/pageName

    在我的系统中 用户需要有他们的个人资料页面 我要求这些页面将显示在 url 中 如下所示 www example com John Doe www example com Mary Smith 如何在 yii2 中实现这些 URL 这些 J
  • 使用VBA获取word中的所有交叉引用

    我有一个相当大的 Word 文档 gt 400 页 其中有很多标题的交叉引用 到目前为止 我一直引用标题的标题 但现在我想更改它并引用标题所在的页面 我没有通过 GUI 找到解决方案 当然 手动处理除外 所以我正在考虑编写一些 VBA 不幸
  • XPATH获取text_1和text_2之间的所有节点

    我有这样的 HTML div text1 a link 1 a a link 2 a text2 a link 3 a text3 div 我想获取之间的所有节点text1 and text2 问题是没有p or span标签 只有纯文本
  • Google App Engine 在处理信号后终止:术语

    我有一个应用程序部署为 GCP 上的应用程序引擎 它调用 API 创建 Bytes IO 流并将数据上传到云存储 有 4 个文件 大约 44mb 需要上传 文件是 URL 列表 然后将其提供给数据流 但这并不重要 一开始 我为每个文件创建了
  • 带有负秒的奇怪 mktime 逻辑

    我一直在使用 mktime localtime 进行时间管理 包括一些关于日期 时间的繁重算术 当向 mktime 提供包含负值的 struct tm 时 我注意到一些非常奇怪的事情 采取下面的代码 2013 年 11 月 3 日 洛杉矶的
  • 如何在C中分配和释放对齐内存

    如何分配与 C 中特定边界 例如缓存行边界 对齐的内存 我正在寻找类似 malloc free 的实现 理想情况下应尽可能可移植 至少在 32 位和 64 位架构之间 编辑添加 换句话说 我正在寻找一些行为类似的东西 现在已经过时了 mem
  • 在 R / Rmarkdown 中同步两个传单地图

    JS 传单允许需要同步的两个地图 https github com turban Leaflet Sync 查看同步传单地图示例here http blog thematicmapping org 2013 06 creating sync
  • 在同时活动的多个进程中更新 Java 中的数据

    我正在创建一个带有传感器的令牌环 其中每个传感器都是一个独立的进程 当我启动传感器时 它与网关通信并获取系统上已有的实际传感器的列表 问题是 每次我开始一个新进程时 我希望每个现有的传感器都能获取更新的列表 以便了解其他传感器已被添加 并且
  • 如何制作无限分页的UICollectionView?

    我有一个包含 6 页且启用分页的 UICollectionView 和一个 UIPageControl 我想要的是 当我来到最后一页时 如果我向右拖动 UICollectionView 会从第一页无缝地重新加载 void scrollVie
  • VS 2017 的 .net Core Webpack 发布失败

    我正在尝试将 net Core Angular 4 项目从 Visual Studio 发布到 Azure 在发布过程中 我收到以下错误 ERROR in gendir angular tree component dist compone
  • 求和与分组

    我有一个如下所示的数据框 全部控股基金 BrokerBestRate notional current DistanceBestRate 0 CITI 7 859426e 05 0 023194 1 WFPBS 3 609674e 06 0
  • 如何避免 Observable 中超出最大调用堆栈大小?

    我已经过滤了列表 public filteredEvents new BehaviorSubject 以及反转属性的方法checked export并将更改推回 public checkAll void this filteredEvent
  • Qt 5.5 - 触摸屏事件仅在初始(第一个)窗口中工作

    我已经设置了一个基本的 Qt Widgets Application Qt 5 5 社区 其中包含一个简单的 QWidget MainWindow 和一个附加的 QWidget SettingsScreen 在 MainWindow 中 触
  • Django - 与模型无关的自定义管理页面

    我正在使用 Django 1 7 和 Mezzanine 我希望在管理中有一些页面 工作人员可以在其中使用按钮和其他控制元素调用一些操作 管理命令等 我还想避免创建新模型 或手动创建模板并添加指向它的链接 如果可能 实现这一目标的最常见 最
  • 在 pthread_mutex_init 之前调用 pthread_mutex_lock 是否安全?

    我以前从未有机会使用 pthreads 库 但我正在审查一些涉及 pthread 互斥体的代码 我检查了文档pthread mutex lock and pthread mutex init 通过阅读这两个函数的手册页 我的理解是我必须调用
  • ES6 模块和继承

    我有以下 JavaScript 文件 src js classes Lexus js import Car from src js classes Car export class Lexus extends Car constructor