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是同一个实例
posted @ 2022-03-11 11:23  青仙  阅读(66)  评论(0编辑  收藏  举报