我有一个 JS 类,当我使用相同的参数创建相同的类时,我希望能够“重用”它,而无需多次运行构造函数。
该用例例如是创建到数据库的连接,该连接可以同时从多个函数调用,并且可能需要一段时间才能建立。例如,函数1在部分代码中调用MyClass('url1'),而函数2在其他地方同时调用MyClass('url1')。我希望能够避免创建 2 个与数据库的连接,同时仍然能够创建 MyClass('url22222')。
课程看起来像:
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
创建的对象(在您的情况下,这似乎不值得麻烦),您必须创建某种静态工厂方法来执行您想要的操作想要。
如果您同意
Proxy
,您可以为这种情况创建一个通用工厂函数并将其与任意数量的类一起使用:
const MyClass = factory(class MyClass {
static test(){ console.log('test'); }
constructor(url) {
this.url = url;
console.log("Constructing MyClass with", url);
}
});
new MyClass("url1");
new MyClass("url1");
const my = new MyClass("url22222");
console.log(my instanceof MyClass);
MyClass.test();
function factory(what){
const instances = '__$instances';
if(!Object.hasOwnProperty(what, instances)){
Object.defineProperty(what, instances, {value:{}});
}
return new Proxy(what, {
construct(_, args){
return what[instances][args[0]] ??= new what(...args); // you could join multiple args if needed
}
});
}