?
/*第一种方式:
简单的使用一个私有变量来控制是否允许本次实例化对象获得一个this地址
第一次实例化对象的时候instance为null,允许将getInstance构造的内存地址分配给该实例对象,
第二次
实例化对象,由于私有变量已经被赋值为getInstance的地址,所以直接返回这个地址,
由此可以让两个甚至
多个对象的地址都是完全一样的,从而实现单例对象模式。
*/
const test=function(){
let instance=null; //私有静态变量
const getInstance=function(){
this.init=1;
if(!instance){
instance=this; //this指向getInstance地址
}
return instance;
}
return getInstance;
}();
const t=new test();
const t2=new test();
console.log(Object.is(t,t2)); //true
console.log(t.init); //1
/*
第二种方式:
思路是:用一个根对象去实例化Test()方法,得到一个静态的instance属性,
在通过根对象instance对原型对象上的方法getInstance()去获取地址,
最后获取的t1、t2都指向Test(){}
*/
function Test(){
Test.instance=null;
this.num=0;
}
Test.prototype.getInstance=function(){
if(!Test.instance){
Test.instance=this;
}
return Test.instance;
}
Test.prototype.getNum=function(){
this.num++;
}
const instance=new Test();
const t1=instance.getInstance();
const t2=instance.getInstance();
console.log(Object.is(t1,t2));//true
t1.getNum();
t1.getNum();
console.log(t2.num); //2
/*
第三种方式:
这种方式是第一种方式的改进版本,原理同第一种方式
*/
const Test=function(){
let instance=null;
function getInstance(){
instance=instance || this;
this.init();
return instance ;
}
getInstance.prototype.init=function(){
this.num=0;
}
return getInstance;
}();
Test.prototype.getNum=function(){
return this.num;
}
const test=new Test();
const test2=new Test();
console.log(Object.is(test,test2)); //true
console.log(test); //getInstance { num: 0 }
console.log(test.getNum()); //0
|