JS-单例模式

223 阅读1分钟

单例模式讲道理我还不是很清楚应用场景,只是知道不断地new是同一个对象,防止代码上的冗余。

  1. 一个构造函数内有函数,如果直接new这个构造函数,最终将生成无数次同样的内部函数。然而把这些内部函数挂到原型上不就好了
  2. 如那种弹窗类的,用单例和直接切换显示的位置好像也能解决 不理解

将构造函数变为单例模式的构造函数

//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函数分析:

  1. sigleEle函数用到了闭包,变量_sigleEle不会被外界访问到
  2. _sigleEle用于存储第一次生成的对象,第二次new的时候,会直接返回_sigleEle这个对象
  3. 第一次new singleStudent的时候,_sigleEle为null,执行到_sigleEle = new fn(...args),这里返回的是fn的实例,被保存。后面必须加上return _sigleEle,为的是取代singleStudent本身的this返回给st1