我有一个JS类,希望在使用相同参数创建相同的类时能够"重用"它,而无需多次运行构造函数.

例如,该用例是创建到数据库的连接,该数据库可以同时从多个函数调用,并且可能需要一段时间才能建立.例如,代码的一部分中的function 1调用MyClass(' url 1 '),而function 2在其他地方同时调用MyClass(' url 1 ').我希望能够避免创建2个到数据库的连接,同时仍然能够创建MyClass("url 22222").

该类看起来像:

class MyClass {
  constructor(url) {
    this.url = url;
    console.log("Constructing MyClass with", url);
  }
}

new MyClass("url1");
new MyClass("url1");
new MyClass("url22222");

目前输出如下:

Constructing MyClass with url1
Constructing MyClass with url1
Constructing MyClass with url22222

目标是获得如下输出:

Constructing MyClass with url1
Constructing MyClass with url22222

感谢您的帮助!

我试图将创建的网址存储在外部数组中,但它看起来不太漂亮. 还看了静态初始化器,但据我所知,无论提供的参数如何,它每个类只运行一次.

推荐答案

构造函数可以返回自动创建的对象以外的对象(由new提供).因此,您可以将实例保留在某种缓存中,并使用URL作为关键字.

class MyClass {
  static #instances = {}
  constructor(url) {
    if (url in MyClass.#instances)
      return MyClass.#instances[url];

    this.url = url;
    console.log("Constructing MyClass with", url);
    MyClass.#instances[url] = this;
  }
}

new MyClass("url1");
new MyClass("url1");
new MyClass("url22222");

如果您想避免扔掉由new创建的对象(在您的情况下,这似乎不值得麻烦),您就必须创建某种静态工厂方法来完成您想要的事情.

Javascript相关问答推荐

我的YouTube视频没有以html形式显示,以获取免费加密信号

如何分配类型脚本中具有不同/额外参数的函数类型

使用JavaScript重新排序行

如何在Obsidian dataview中创建进度条

将本机导航路由react 到导航栏中未列出的屏幕?

如何让npx在windows中运行js脚本?

在react JS中映射数组对象的嵌套数据

我怎么才能得到Kotlin的密文?

编辑文本无响应.onClick(扩展脚本)

JS:XML insertBefore插入元素

是什么导致了这种奇怪的水平间距错误(?)当通过JavaScript将列表项元素追加到无序列表时,是否在按钮之间?

对路由DOM嵌套路由作出react

类构造函数忽略Reaction Native中的可选字段,但在浏览器中按预期工作

NG/Express API路由处理程序停止工作

Nextjs 13.4 Next-Auth 4.2登录(&Quot;凭据&,{});不工作

如何访问此数组中的值?

我想使用GAS和HTML将从Electron 表格中获得的信息插入到文本字段的初始值中

FireBase云函数-函数外部的ENV变量

递增/递减按钮React.js/Redux

我如何才能让p5.js在不使用实例模式的情况下工作?