JS 单例模式
当我们不希望每次使用的时候都要新建一个实例对象,我们需要使用这种方法。
现在考虑一个问题:
var fun = function(){}
var fun1 = new fun();
var fun2 = new fun();
console.log(fun1 === fun2);
我们要返回 true,该怎么做呢?
第一种
var obj = {};
function fun(){ return obj;}
var fun1 = new fun();
var fun2 = new fun();
console.log(fun1 === fun2); //ture
第二种
var fun = function (){
if(fun.ins) return fun.ins;
return fun.ins = this;
}
这种方式主要是通过给函数体绑一个静态属性,通过将第一次 new 时候的 this 传给创建的静态属性,然后在第二次返回的是静态属性的值
第三种
var fun = function (){
var instance = this; //缓存实例
fun = function(){ //重构函数
return instance;
}
}
仔细看的话会发现其实形成了一个闭包,内部函数使用了外部的私有变量,导致垃圾回收机制不会回收 instance
应用场景
JS 单例模式
function fun(arg){
if(fun.ins) return fun.ins;
this.a = arg.a || 111;
this.b = arg.b ||222;
this.say = function(){
console.log(this.a,this.b);
}
return fun.ins = this;
}
new fun({
a: 1,
b : 2
}).say()
new fun({
a: 2,
b:1
}).say()
两次返回的值相同,这是因为第二次 new 的时候其实调用的是第一次的 this 。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
上一篇: jQuery 插件开发
下一篇: 函数式编程:概念,惯用语和理念
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论