单例模式讲道理我还不是很清楚应用场景,只是知道不断地new是同一个对象,防止代码上的冗余。
- 一个构造函数内有函数,如果直接new这个构造函数,最终将生成无数次同样的内部函数。然而把这些内部函数挂到原型上不就好了
- 如那种弹窗类的,用单例和直接切换显示的位置好像也能解决 不理解
将构造函数变为单例模式的构造函数
//fn是一个构造函数,而sigleEle是将构造函数变成单例模式的函数
let sigleEle = function (fn) {
let _sigleEle = null//用于存储第一次生成的对象
return function (...args) {
if (_sigleEle) {//_sigleEle已经存储了fn第一次生成的对象
fn.call(_sigleEle, ...args)//用call改变内部this指向为最初的fn实例对象
return _sigleEle
}
//_sigleEle为空执行下面代码
_sigleEle = new fn(...args)
return _sigleEle
}
}
//构造函数
function Student(name){
this.name = name
}
Student.prototype.addAge = function(age){
this.age = age
}
//将Student变为单例模式的构造函数,取名singleStudent
let singleStudent = sigleEle(Student)
let st1 = new singleStudent("wangwu")
let st2 = new singleStudent("lisi")
st1.addAge(13)//原型上的方法也可以使用
console.log(st1)
console.log(st1===st2)//true
sigleEle函数分析:
- sigleEle函数用到了闭包,变量_sigleEle不会被外界访问到
- _sigleEle用于存储第一次生成的对象,第二次new的时候,会直接返回_sigleEle这个对象
- 第一次new singleStudent的时候,_sigleEle为null,执行到_sigleEle = new fn(...args),这里返回的是fn的实例,被保存。后面必须加上return _sigleEle,为的是取代singleStudent本身的this返回给st1