我发现了不同的主题说明了如何创建单身人士,但它们都不适合我。这是从这篇文章中获取的一个例子
export default class Credentials {
static myInstance = null;
_userID = "";
static getInstance() {
if (myInstance == null) {
myInstance = new Credentials();
}
return myInstance;
}
getUserID() {
return this._userID;
}
setUserID(id) {
this._userID = id;
}
}
当我致电Credentials.getInstance()
时,我会得到警告
找不到可变的myinstance
js没有像静态编译的语言那样隐含的字段查找。您需要明确查找类:
class Credentials {
static myInstance = null;
static getInstance() {
if (Credentials.myInstance == null) {
Credentials.myInstance = new Credentials();
}
return Credentials.myInstance;
}
}
请谨慎使用这种方法,因为它不是真正的单例,因为JS没有适当的类封装。
您可以轻松地直接更改实例:
Credentials.myInstance = 'something else';
应通过封闭来实现具有封装的适当单例:
const Credentials = (() => {
let myInstance = null;
return class Credentials {
static getInstance() {
if (myInstance == null) {
myInstance = new Credentials();
}
return myInstance;
}
}
})()
我认为最简单,最简单的解决方案将是" ES6 Singleton模式"(不确定此模式是否有正式名称)。
您将实例导出为默认值,到处导入它,您可以获得相同的实例。这取决于模块要求被缓存的事实。
您将创建班级并导出类似:
class Credentials {
constructor() {
this._userID = "";
}
get userID() {
return this._userID;
}
set userID(userID) {
this._userID = userID;
}
}
export default new Credentials();
无论您在哪里导入它,都可以获得相同的实例:
import credentials from './credentials';
这应该足够适合JS中的任何单吨实例。
现在,无论您在任何地方导入该实例。您可以通过在课堂内添加日期并在您导入此的各个地方访问该日期来进行交叉检查。
import { SomeClass } from 'some-class'
let singletonInstance;
if (!singletonInstance) {
singletonInstance = new SomeClass();
// singletonInstance.time = new Date();
}
export default singletonInstance;
然后使用
导入它 import singletonInstance from './above-code-file'