单例模式浅解

  • 什么是单例模式呢?

  • 我们都知道,构造函数可以创造一个对象

  • 我们 new 很多次构造函数就能得到很多的对象

  • 单例模式: 就是使用构造函数实例化的时候,不管实例化多少回,都是同一个对象

    • 也就是一个构造函数一生只能 new 出一个对象

  • 也就是说,当我们使用构造函数,每一次 new 出来的对象 属性/功能/方法 完全一样 的时候,我们把他设计成单例模式

其主要核心:只能创建一个对象,并向外提供全局访问

在JavaScript中也有不被常人所知晓的单例

例:var a也满足创建一个对象,提供全局访问

var a={
}

讲起全局访问

var a 这种全局变量很容易引起命名空间污染,特别是在做大项目中,会导致变量之间的相互覆盖

避免命名环境污染有常见的两种方法

一:空间命名法

二:闭包(可以彻底解决该问题)

没有使用单例模式在body内添加div元素,函数调用多次便会出现多个div


        利用普通函数创建div盒子
        获取元素时使用querySelector,后续插入多个div子只会获取一个
        由此可以发现,多次调用boxs时,会创建多个div
        
        function boxs(){
            var div=document.createElement("div");
            div.style.width=100+"px";
            div.style.height=100+"px";
            div.style.backgroundColor="red";
            div.style.marginTop=10+"px";
            document.body.appendChild(div);

        }
        boxs();
        boxs();
        boxs();
        

 

单例模式又分为惰性单例和非惰性单例

惰性单例:调用时才会创建对象(因为创建对象和管理单例在一个函数内)

        使用惰性单例模式在body内添加div元素,函数调用多次也只会出现一个div

       // 利用惰性单例模式创建div(登录表单)
        // 惰性单例模式:在需要时才会创建,
        // 因为创建对象和管理单例存放在一个函数在所导致惰性单例
        // 当我们需要创建唯一的对象时,只能copy,
        var boxs=(function(){
            //创建一个空变量
            var div;
             // 没有内容则return 一个函数
            //  使用闭包思想
            return function(){
            // 判断该变量有无内容
            if(!div){
                div=document.createElement("div");
               div.style.width=100+"px";
               div.style.height=100+"px";
               div.style.backgroundColor="red";
               div.style.marginTop=10+"px";
               document.body.appendChild(div);
            }
        }
    })();
        // 单例模式下无论还函数被调用多少次,都只会触发一次,常用于弹出登录框和购物车
        // 单例模式的核心是确保只有一个实例,提供全局访问
        // 全局访问意味着全局变量,容易造成命名空间污染
        boxs();
        boxs();
        boxs();

非惰性单例模式:浏览器打开便创建对象(将单例管理提出即可)

 

// 我们把管理单例提取出来,
   
    var danl=function(fn){
        // 用来保存div
        var red;
        return function(){
            // (red=fn.apply(this,arguments)) 该代码没有实质性作业,用于传递但该参数不固定
            return red || (red=fn.apply(this,arguments))
        }
        
    }


    var divs=function(){
        div=document.createElement("div");
        div.style.width=100+"px";
        div.style.height=100+"px";
        div.style.backgroundColor="red";
        div.style.marginTop=10+"px";
        document.body.appendChild(div);
        return div;
    }
   
    var divss=danl(divs)
    divss();
  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值