单例模式概念单例模式指的是只在内存中创建一次对象的设计模式。当程序中多次使用同一个对象,效果相同时,为了防止频繁创建对象造成内存占用,单例模式允许程序在内存中只创建一个对象,这样所有需要的地方调用共享此单例对象。优点适用于单个对象,只生成一个对象实例,避免频繁创建和销毁实例,减少栈内存占用。实例只有一个,实例可以全局访问,便于维护一个全局的实例对象。缺点不适用于动态扩展对象,创建多个相似对象的场景。让A=function(name){this.name=namethis.ins=null}A.getName=function(name){returnnewA(name)}A.toNum=function(age){if(!isNaN(age)){returnNumber(age)}else{return'unknownage'}}//实例控制器A.insHandle=function(str){if(this.ins){//核心点只允许一个实例返回this。ins}returnthis.ins=newA(str)}console.log(A.getName('张三').name,A.toNum(44),A.insHandle('这是一个实例').name)//张三44是一个实例定义A函数,A是一个实例。因此,我们可以在函数A中定义一个insHandle()方法来管理这个单例并创建返回类实例对象,而不是通过传统的new操作符创建类实例对象。this.ins存放创建的实例对象,每次接收到创建的实例对象,判断this.ins是否有实例对象,有则返回,没有则创建并更新this.ins的值,所以不管insHandle()被调用了多少次,最后只会返回类A的同一个实例对象(returnthis.ins=newA(str))。但是,这种单例管理操作加上对象创建操作和函数代码,不符合“单一职责原则”,不能用new来实例化一个类。我们需要限制这个类实例化的调用方法。letA=(function(){letins;returnfunction(name,age,msg){if(ins){//核心点只允许一个实例returnins;}this.name=name;this.age=age;this.msg=msg;returnins=this;}})();A.prototype.getMsg=function(){return`${this.name}${this.age}${this.msg}`}letzs=newA('张三',44,'这是一个实例')letls=newA('李四',32,'这是一个实例')console.log(zs===ls);trueconsole.log(ls.getMsg());//张三44这是一个实例console.log(zs.getMsg());//张三44这是一个实例
