设计模式系列-1.单例模式
为什么要强调设计模式..太重要了这玩意..有的时候反思我为什么看不懂大神写的代码..一方面就是不懂设计模式..或者反应不出来这玩意到底是什么设计模式
大部分资料出自网络..提纲按照汤姆大叔的来
单例模式
一个类只有一个实例
一般定义类: 缺点是暴露属性
1 | var obj = { |
闭包改进
1 | var getObj = function(salary){ |
再改进
上面的代码很不错了,但如果我们想做到只有在使用的时候才初始化,那该如何做呢?为了节约资源的目的,我们可以另外一个构造函数里来初始化这些代码,如下:
IIFE 初始化形式
1 | var mySingleton_1 = (function(salary){ |
别的方法实现单例 new构造函数形式
1 | // 其他方法 |
不足在哪? 单例不受保护…u1, u2之间可以篡改Single.instance
知识无处不相通..再复习一下new 的过程
参考1
2var F = function(){}
var A = new F();
过程
- 新建一个对象
1 | var instance = new Object(); |
- 设置原型链
1 | instance.__proto__= F.prototype; |
让F中的this指向instance,执行F的函数体.. call or apply的过程
判断F的返回值
如果是值类型,就丢弃它,还是返回instance。
如果是引用类型(包括返回this),就返回这个引用类型的对象,替换掉instance
故可以模拟new
1 | var newF = function(...rest){ |
但是这样有个问题…instance被夹在Single属性里了…
再改进…重写构造函数 缓存的实例不被夹在构造函数里了
1 | // 改进 重写构造函数 |