首先奉上文章学习链接:https://www.cnblogs.com/imwtr/p/9451129.html#o1设计模式的讲解 很全
代码:
假设要设置一个管理员,多次调用也仅设置一次,我们可以使用闭包缓存一个内部变量来实现这个单例
function SetManager(name) {
this.manager = name;
}
SetManager.prototype.getName = function() {
console.log(this.manager);
};
var SingletonSetManager = (function() {
var manager = null;
return function(name) {
if (!manager) {
manager = new SetManager(name);
}
return manager;
}
})();
SingletonSetManager('a').getName(); // a
SingletonSetManager('b').getName(); // a
SingletonSetManager('c').getName(); // a
这里面涉及的知识点 1.构造函数SetManager
2.prototype 原型链继承 SetManager对象里有个prototype的属性 这个对象实例化后let a = new SetManager() a中有个__proto__会指向 SetManager 的 proto 简单说就是给 SetManager设置一个属性getName那么 它的实例a也会获得属性getName
3.闭包 我最想要分享就是这个 看下面的文字理解 这个单例模式是怎么通过闭包来实现的
通过上面最后几行代码可以看到 执行完
SingletonSetManager('a').getName()
后,后面不管怎么传值
this.manager
的值都不会变,那么怎么实现不会变的呢 看
SingletonSetManager
里面的代码 有个局部变量
manager,
然后下面有个语句
if (!manager) { manager = new SetManager(name); },
就是说他是通过判断
manager
来实现的,可是manager这个变量只是局部变量啊,我真的懵逼了好久,后来通过输出日志才反应过来,执行完
SingletonSetManager()
后得到是一个函数,一个闭包内的函数
function(name) {
if (!manager) {
manager = new SetManager(name);
}
return manager;
}
也就是说
SingletonSetManager() = function(name) {
if (!manager) {
manager = new SetManager(name);
}
return manager;
}
而得到这个闭包内的函数后 这个函数里面的变量manager仍存在在闭包内 没有被销毁,所以执行完
SingletonSetManager('a').getName()
后,函数内变量manager就被赋值成为了
manage = new SetManager(name)
当再次执行
SingletonSetManager('b')
时,manage的值已经是new SetManager(name)不再是null了
也就是说闭包的变量只有还在起作用作用,它就不会被销毁
就是这样通过在闭包设置变量保存一个值的状态来实现一个单例模式