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

推荐订阅源

G
Google Developers Blog
博客园 - 聂微东
J
Java Code Geeks
Engineering at Meta
Engineering at Meta
Jina AI
Jina AI
D
Docker
B
Blog
S
SegmentFault 最新的问题
宝玉的分享
宝玉的分享
D
DataBreaches.Net
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Y
Y Combinator Blog
N
Netflix TechBlog - Medium
月光博客
月光博客
F
Fortinet All Blogs
爱范儿
爱范儿
H
Help Net Security
腾讯CDC
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
WordPress大学
WordPress大学
The Cloudflare Blog
有赞技术团队
有赞技术团队
T
Tailwind CSS Blog
U
Unit 42

博客园 - 想那风霜雪

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