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

推荐订阅源

酷 壳 – CoolShell
酷 壳 – CoolShell
Microsoft Security Blog
Microsoft Security Blog
Recent Announcements
Recent Announcements
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Last Week in AI
Last Week in AI
罗磊的独立博客
腾讯CDC
云风的 BLOG
云风的 BLOG
月光博客
月光博客
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 三生石上(FineUI控件)
宝玉的分享
宝玉的分享
U
Unit 42
I
InfoQ
D
DataBreaches.Net
Blog — PlanetScale
Blog — PlanetScale
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
V
V2EX
美团技术团队
IT之家
IT之家
Stack Overflow Blog
Stack Overflow Blog
F
Fortinet All Blogs
GbyAI
GbyAI
S
SegmentFault 最新的问题

博客园 - 想那风霜雪

基于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();  来创建.这里就形成了单件模式的必要条件.