架构师基本修养系列—Javascript之单例模式【设计模式篇】

普通单例模式

let instance=null;
function Demo(){
if(instance){
return instance;
}
instance=this;
}
let a=new Demo();
let b=new Demo();
console.log(a===b);指向同一个实例,同一片内存地址

在这里插入图片描述

虽然上述例子的确实现了单例模式,但是instance暴露在了外面,外界可以访问到并且修改,引起不必要的问题!

就绪函数+单例模式

(function(e){
let instance=null;//屏蔽了instance,使外界不可访问
function Demo(){
if(instance){
return instance;
}
instance=this;
}
e.Demo=Demo;//将构造函数挂载到Window上,供外界访问.
})(window);
let a=new Demo();
let b=new Demo();
console.log(a===b);

在这里插入图片描述

这里是引用

闭包-惰性函数-单例模式

function Demo(){
var instance=this;
Demo=function(){  //惰性函数(只执行一次,后面直接调用)
return instance;
}
}
let a=new Demo();
let b=new Demo();
console.log(a===b);

在这里插入图片描述

但是还是会有个问题,接下来我们来探讨下哈!

在这里插入图片描述在这里插入图片描述

以上将Demo.prototype.mydemo=“asdasdasd”;
放在let a=new Demo();
let b=new Demo();之前,是没问题的,因为a、b实例的constructor都是指向最外层的Demo()

在这里插入图片描述在这里插入图片描述

因为Demo.prototype.mydemo=“asdasdasd”;放在中间的话在这里插入图片描述在new第一个Demo实例时,已经把惰性函数赋值给了Demo
所以constructor就改变了。而从始至终返回的还是最外层的Demo实例,
自然就为undefined了,接下来咱们就进一步进行改善吧!

在这里插入图片描述在这里插入图片描述

把Demo()原型挂载到惰性函数Demo()原型上就完事啦~

好啦~今天就分享到这里啦!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值