啊?现在都用什么形式?
如果你没有在构造内初始化,可以直接用 export default new class()
这个操作不错
我是这样的:


装饰器避免重复代码,类型声明解决提示。
主要是静态get不能使用泛型,就绕不出来了
弄成全局变量就行了,类似2.x的cc,不需要import任何文件都可以访问
噢噢~学习了
这种工具类可以,但是我还有一些manager是需要在cocos里自己挂载的。挂载完成再吧自己的instance加上实体。
最后还是用括号吧~虽然我觉得括号不够优雅。。。
export const httpctrl = new HttpCtrl(); 然后用就httpctrl.xxx 也是单例
感觉是设计问题。
不该用模板类
可以试试泛型单例
是这样的,基类:
export default class Singleton {
private static _instance: any = null;
static GetInstance<T>(): T {
if (this._instance === null) {
this._instance = new this();
}
return this._instance;
}
protected constructor() {}
}
继承
@ccclass('SnakeDataManager')
export class SnakeDataManager extends Singleton {
static get Instance() {
return super.GetInstance<SnakeDataManager>();
}
hello(){
console.log("你好");
}
}
调用
SnakeDataManager.Instance.hello();
刚好上周我也纠结这个扩号,之前找了第一种,函数式创建类单例,觉得代码有点多余,偶然在一个帧同步项目发现别人写的,这应该是比较少的代码行数了。
class Test {
…
}
export const test = new Test();



export default class XXUtils{
//将XXUtis类设置成单例类
constructor(){return XXUtils[‘instance’] ??= this;}
}
//将XXUtils类的唯一单例添加到全局变量
window[‘xx’[ = new XXUtils();
————————————————————————
//在asset同级目录新建一个XXUtils.d.ts文件,类似cc.d.ts
declare global{
//告诉所有文件,有xx这个全局变量
const xx:XXUtils;
age:number = 5;
jump(){
console.log(‘jump!!’);
}
}
————————————————————————
这样任何文件直接xx.age或xx.jump来调用XXUtils里的变量或函数就行了无需import,类似2.x的cc
看了这么多单例,终于看到个语法是对的,代码量少的了。
GetInstance<T> 改成 GetInstance<T extends Singleton> 完美
这个虽然还要在子类写东西。但是确实用的时候优雅了~优雅~绝对的优雅
你这个虽然还要确定不是反串吗 所以为什么不直接用用户代码片段呢 我觉得都不如new一个实例再export来的优雅
另外 这个浏览量下只有这么点回复 大家肯定不是进来找所谓的优雅的单例 而是来吃茴香豆的居多吧
奇怪怎么吃不腻 

