惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

有赞技术团队
有赞技术团队
Martin Fowler
Martin Fowler
N
Netflix TechBlog - Medium
WordPress大学
WordPress大学
罗磊的独立博客
H
Help Net Security
MongoDB | Blog
MongoDB | Blog
A
About on SuperTechFans
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
D
Docker
云风的 BLOG
云风的 BLOG
Microsoft Security Blog
Microsoft Security Blog
Blog — PlanetScale
Blog — PlanetScale
P
Proofpoint News Feed
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
I
InfoQ
J
Java Code Geeks
博客园 - 聂微东
大猫的无限游戏
大猫的无限游戏
Engineering at Meta
Engineering at Meta
美团技术团队
小众软件
小众软件
Stack Overflow Blog
Stack Overflow Blog
C
Check Point Blog

博客园 - 想那风霜雪

基于web的甘特图,易度甘特图edogantt! JavaScript异常处理 - 想那风霜雪 - 博客园 一个支持Drag页面拖动的组件 - 想那风霜雪 - 博客园 main Function和Object(2) Function和Object(1) - 想那风霜雪 - 博客园 Atlas系列:从AtlasRuntime.js开始-简介 Atlas源码阅读系列之一 9)使用面向对象思想处理cookie 8)事件设计模式 7)实现抽象类 6)类的继承 5)使用for(...in...)实现反射机制 4)公有成员\私有成员和静态成员 - 想那风霜雪 - 博客园 3)类的实现 2)深入认识JavaScript中的函数 1)JavaScript面向对象的基础 JavaScript的OO特性:私有访问限制实现 JavaScript的OO特性:继承
JavaScript的OO特性:Singleton单件模式
想那风霜雪 · 2006-08-11 · via 博客园 - 想那风霜雪

        只要有程序设计,就可以有设计模式.
        JavaScript实现单件模式需要一些技巧,如我们定义一个类:

        function SingletonObject()
        
{
            
this.methodA = function()
            
{
                alert('methodA');
            }

            
this.methodB = function()
            
{
                alert('methodB');
            }

            SingletonObject.instance 
= this;
        }
   

        如果想要使这个类只实例化一个类,单靠一般的单件模式是行不同的,因为只要new Object,就会创建一个对象实例.
        这里我们需要配合使用工厂方法模式,才能构建SingletonFactory类的单件模式,如下:

<script type="text/javascript">
    
    
//利用匿名函数实现单件模式.
    (function(){          
        
//工厂模式
        //创建一个类的创建工厂类.
        SingletonFactory = {
            create : 
function(){
                
if(SingletonObject.instance == null)
                    
return new SingletonObject();           
                
else
                    
return SingletonObject.instance;
            }
            
        }


        
//私有类
        function SingletonObject()
        
{
            
this.methodA = function()
            
{
                alert('methodA');
            }

            
this.methodB = function()
            
{
                alert('methodB');
            }

            SingletonObject.instance 
= this;
        }
     
    }
)();

//经过以上设置后,只能通过SingletonFactory.create()来创建SingletonObject类的实例,而且是单一的实例.
//
如用 new SingletonObject()就会出错.
var instA = null;
try
{    
    instA 
= new SingletonObject();  //不能用此方式进行创建了.
    alert("试图通过new SingletonObject()构造实例!成功啦");
}

catch(e){alert("SingletonObject构造函数不能从外部访问,系统抛出了异常!");}

instA 
= SingletonFactory.create();  //通过Factory上定义的静态方法获得
var instB = SingletonFactory.create();
instA.methodA();
instB.methodA();
alert(instA 
== instB); //显示"true"则成功

</script>

        这里的实现依赖于匿名函数的技巧,使SingletonObject类成为"私有"类,不能对外用new关键字来创建,而只能通过SingletonFactory.create();  来创建.这里就形成了单件模式的必要条件.