7、闭包实现单例
闭包
1、单例属性
function Person(){
var name="ace";
var age=18;
return function(){
var birthday=2002;
console.log(`name is:${name},age is: ${age++},birthday is: ${birthday++}`);
}
}
var p1=new Person();//由于这个类返回的是一个方法,所以实例化出来的p1也只是一个方法,不管p1调用多少次,age是不会被重置的。
p1();//age:18,birthday:2002
p1();//age:19,birthday:2002
p1();//age:20,birthday:2002
如果重新实例化的话,age是会被重置的
2、单例对象
function Person(){
this.age=18;
}
const singleton=(function (){
var instance=null;//单例
return function(){
if(!instance)
instance=new Person();
return instance;
}
})();
//per1和per2都是同一个对象,因为singleton方法实例后会直接返回一个person对象,而这个方法内部又是闭包实现单例instance,主要是因为singleton的匿名方法会自调用,所以,匿名方法创建了就调用了,
//所以常量singleton里装的就是一个单纯的Person对象的实例。
var per1=new singleton();//加括号表示会调用singleton方法。
var per2=new singleton();
console.log(per1);//结果为Person的实例
console.log(per2);//结果为Person的实例
console.log(per1==per2);//结果为true,因为他们是同一个实例
per1.age++;
console.log(per2.age);//结果为19,因为per1和per2是同一个实例