一个例子贯穿单例模式,Typescript的private,public,static 属性理解

2,783 阅读2分钟

什么是单例模式

通俗的讲单例模式就是不允许通过 const instent = new Demo() 的形式来多次实例化一个类,所以我们首先会有如下的代码


原理:我们可以看到实例化的时候 new Person()下面飘红了,解释是不允许实例化构造函数是私有类型的类,因为 private声明后只能在类的内部使用

变通

既然不能通过外部实例化这个类,那么我们只能通过内部来访问,同时也要通知外部,所以我们有了如下的代码


原理:通过 static声明我们可以通过类的本身来调用这个方法,通过这个方法再来实例化这个类,就达到了内部访问私有构造函数的目的。

或许看到这,你会不屑的说一句:绕来绕去有区别吗?多次调用这个静态方法不还是多次实例化了这个类。。。(没错!的确是这样)

完善

为了解决上面提到的问题,我们可以用一个变量用来专门保存一个实例,当再次访问的时候我们直接返回这个变量是不是就可以完美解决这个问题了?所以上代码


原理: 我们声明一个私有变量instance(为什么又是静态的呢?)来存储我们第一次实例化的结果,然后之后的每次访问因为instance已经是存在的了所以返回的结果都是同一个实例,所以是不是就达到了单例的效果呢?至于为什么又是静态的呢?因为在static声明中访问的this都是类本身,我们如果不写static,那么这个this是访问不到实例属性的。

加餐

下面是一个关于ts public属性的小技巧


我们通常的做法来给类的属性赋值是 将参数传入构造函数,然后在构造函数中在进行赋值,如果是TS还需要先声明属性。

简写如下:


我们可以通过在参数的时候直接给定参数类型,他就等于上面的声明再赋值

总结

通过简单的十几行代码可以很清晰的理解到:

1. 单例模式就是只能实例化一次,之后的每次其实都是访问同一个实例;

2.private 声明后只能在类内部访问到;

3.static 声明后只能通过类本身访问到;

4.public 声明类的属性可以在传参时进行简写