Typescript泛型单例-支持继承,使用方便

萌新想请教一下对比static有什么好处

我的是结合了你的A方案和B方案。A方案使用舒服,但是没有语法提示;B方案有语法提示,但是使用时需要写括号。

懒得写static。有些工具类可能有很多属性和方法,那就要写很多static。

1赞

第二种比较好 有强提示的 第一种提示没有那么强, 方法不是最先显示的

但在调用的时候每次都instance更难看

萝卜青菜各有所爱

感觉这么写用的也还行

像是java过来的

很好很实用

我也有个骚操作:sweat_smile:

class Singleton {
protected constructor() { }
private static inst = null;
protected static getInstance() {
this.inst = this.inst || new this();
return this.inst;
}
}

class A extends Singleton {
public static get Inst(): A { return this.getInstance() }
}

class B extends Singleton {
public static get Inst(): B { return this.getInstance() }
}

多夸夸楼主,不容置疑

使用vscode的用户片段不好吗?提高效率啊

    "prefix": "instance",
    "body": [
        "export default class ${1:NewClass} {",
        "    ",
        "    private static _instance : ${1:NewClass} = null",
        "    public static get instance() : ${1:NewClass} {",
        "        return this._instance || (this._instance = new ${1:NewClass}())",
        "    }",
        "    $0",
        "}",
    ],
    "description": "创建一个单例类"
2赞

在ES6前, 前端就使用RequireJS或者seaJS实现模块化, requireJS是基于AMD规范的模块化库, 而像seaJS是基于CMD规范的模块化库, 两者都是为了为了推广前端模块化的工具;

** 现在ES6自带了模块化, 也是JS第一次支持module, 在很久以后 ,我们可以直接作用import和export在浏览器中导入和导出各个模块了, 一个js文件代表一个js模块;**

现代浏览器对模块(module)支持程度不同, 目前都是使用babelJS, 或者Traceur把ES6代码转化为兼容ES5版本的js代码;
ES6的模块化的基本规则或特点:

1:每一个模块只加载一次, 每一个JS只执行一次, 如果下次再去加载同目录下同文件,直接从内存中读取。 一个模块就是一个单例,或者说就是一个对象;

2:每一个模块内声明的变量都是局部变量, 不会污染全局作用域;

3:模块内部的变量或者函数可以通过export导出;

4:一个模块可以导入别的模块

对对对 :smile:

不太明白为什么一定这类单例
export default new Instance() 不行?

可以的,工具类我一直用,但是有时候需要在模块加载时使用,例如同一个脚本class下方使用,这时候就需要继承单例基类并导出单例