类的静态成员不是ts提出的新语法,而是es6中里面提出的
含义: 静态成员是指,附着在类上的成员(属于某个构造函数的成员),在ts 中的表现是在类中使用 static修饰符进行修饰的成员。例如:
class User { // 静态属性 static users: User[] = []; constructor( public username: string, public password: string) { } // 静态方法 static login() { // do something } }
回忆构造函数
在js中,构造函数也是函数,只是特殊的地方在于,构造函数相对于普通函数来说。使用new 的方式来创建,并且构造函数里面是有this的。这个this 的指向是当前构造函数的对象。而普通的函数的this的指向是指向全局window的。
如下例子:
function User(name, password){ this.name = name; this.password = password; }
上面是一个构造函数,构造函数里面默认是有this的,而且默认返回的是this.例如下面:
function A(){ var this = {}; // ... 中间有无数代码 return this; }
我们可以把上面的构造函数,实现最上面ts 的功能登录功能,登录是每一个用户都是同样的功能,因为我们可以放在构造函数的属性上,达到共享一个方法,节约内存。
代码如下:
function User(name, password){ this.name = name; this.password = password; } User.users = []; User.login = function(){ // do something }
上面的js 写的User类,构造函数,和最上面ts 实现的功能都是一样,我们也可以看一下ts 编译的结果,对比一下。
特性
静态方法中的this
通过上面的回忆构造函数,我们可以得出 es6 或者 ts 中类的static, static就是把成员挂在类上面,在创建类的时候是不能调用的,只有通过类的属性的方式来进行调用。
- 实例方法中的this指向的是当前对象
- 而静态方法中的this指向的是当前类
静态方法的实用性——单例模式
单例模式适用的范围是,整个系统只要有一个实例存在就行,是唯一个的。这样做的好处是每当使用的时候,不需要重写创建对象,浪费不必要的内存
ts 实现单例模式
经典单例模式
class User { private constructor() { } static singleStone: User | undefined = undefined; static createStone() { if (this.singleStone) { return this.singleStone; } else { this.singleStone = new User(); return this.singleStone; } } }
ts特别版本的单例模式
使用构造函数私有化,单例只读属性即可。如下
class User { private constructor() { } static readonly singleStone: User = new User(); }