Javascript 使用react native创建一个单例类
我发现不同的主题解释了如何创建一个单体,但没有一个适合我。这是本文中的一个例子Javascript 使用react native创建一个单例类,javascript,react-native,Javascript,React Native,我发现不同的主题解释了如何创建一个单体,但没有一个适合我。这是本文中的一个例子 export default class Credentials { static myInstance = null; _userID = ""; static getInstance() { if (myInstance == null) { myInstance = new Credentials(); }
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单例模式”(不确定这个模式是否有正式名称) 将实例导出为默认值,并且无论导入到哪里,都会得到相同的实例。这取决于缓存模块require这一事实 您可以创建类并导出如下内容:
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 singletonistance from./上述代码文件“
@Nicodemuz有什么不适合您?我已经在RN项目中多次使用此模式,但没有任何问题。我不断获得一个新实例,而不是相同的实例。有趣的是。。。如果这确实不起作用,我想知道:)你是如何测试它的?我试图在同一个代码块中要求它两次,并进行比较——它们是相等的,就我所知,这意味着相同的实例。我还尝试添加一个静态计数器,该计数器在构造函数中递增,然后在应用程序中的多个位置记录它-总是得到一个计数。