首先问大家一个问题,类的静态属性你会写吗?
哈哈哈,笔者今天被同事问蒙了,什么是静态属性啊。
// ES5 >>>
function Demo(){
}
Demo.sayHello = "Hello";
// ES6 >>>
class Demo{
static sayHello = "Hello"
}
sayHello就是Demo的静态属性,是不是给你唬住了。
所谓的单例其实就是保持只允许有一个单独的实例,甚至你写一个
var a = 10;
你能保证他是唯一的,那他就是一个单例,这种官面话大家去看别的帖子也都有的是,我就不墨迹了,下面是恶汉模式(无论你需不需要用到这个实例,他都会创建出来)的写法:
function Ddd(){
conosle.log("我是ES5恶汉模式的写法");
}
Ddd.prototype.sayName = function(){
console.log("我是恶汉")
}
Ddd.prototype.sayAge = function(){
console.log("我23啦")
}
Ddd.EvilMan = new Ddd();
Ddd.EvilMan.sayName();
Ddd.EvilMan.sayAge();
class Ddd{
static EvilMan = new Ddd();
sayName(){
console.log("我是恶汉ES6")
}
sayAge(){
console.log("我比他大一岁")
}
constructor(){
console.log("我是恶汉ES6的写法")
}
}
Ddd.EvilMan.sayName();
无论你调没调用sayName方法,只要你把这个类引进来了,他就已经创建出来实例化的对象了,将实例化的对象复制给自身的静态属性,所以也就意味着你还没用但是constructor函数就已经会执行了,而懒汉模式是你必须要调用某个方法时,他才会去检测是否有没有这个实例。
class Ddd{
constructor(){
this.init();
this.Instance = null;
}
init(){
console.log("我是懒汉,我有点懒")
}
sayName(){
console.log("我是懒汉")
}
static getInstance(){
if(!this.Instance){
this.Instance = new Ddd();
}
return this.Instance;
}
}
Ddd.getInstance().sayName();
其实也很好理解,恶汉模式赋值给静态属性的时候就已经实例化对象了,所以无论你用不用实例化的方法实例化的对象都已经存在了,懒汉恰恰相反,只有你在用静态方法的时候他才会去实例化对象,所以也就是保证了啥时候用啥时候实例化了,具体应用要看项目,理解起来不难,实际应用才是最难的,而且这些写法其实也都只是一种约定罢了,就像es5你声明类开头字母就要大写一样,你写单例类,如果就是有人不调用你静态属性或者静态方法,非要去new,那你就保证不了这个是一个单例类,所以还要加上各种约束,例如将constructor设置成静态属性来保证new的操作不会有用等,看自己应用了,究竟是约定大于约束呢,还是约束大于约定呢,这是一个问题,哈哈哈哈