JavaScript面向对象编程之Singleton类

    在C#、Java等纯面向对象的语言中,合理使用设计模式将会使我们的模块设计和代码编写更加健壮和清晰。目前JavaScript的编写已经从自身的object-based,被逐渐模拟来很象(至少七八分吧)object-oriented的语言了,所以我们也可以遵照一些设计模式的概念来编写JS代码。

    单态(Singleton)是设计模式中最简的模式了,所以我们先拿它开刀。关于什么是Singleton,可以简单参看Implementing the Singleton Pattern in C#,要系统了解属于就属于设计模式的范畴了,不是本文要讲解的内容。

    不过对于C#,当然也包括Java等其它纯面向对象语言,由于其类的构造函数(constructor)不是一个普通的函数(不能自定义其返回值),所以它们在编写Singleton类时都需要使用一个static的属性或方法来获取对象的实例。而JavaScript中类的constructor就是一个普通的函数,我们可以改变它的返回值来实现对象实例的返回,而不依赖于语言机制。这是到底是什么意思呢 先看一下JS的Singleton类的实现就明白了,示例代码如下:
<script language="javascript">
function Singleton()
{
    
// template code for singleton class.
    if ( this.constructor.instance )
    
{
         
return this.constructor.instance;
    }
 
    
else this.constructor.instance = this;
    
/**//////////////////////////////////
    
    
this.value = parseInt(Math.random()*1000000);
   
    
this.toString = function()
    
{
         
return '[class Singleton]';
    }

}


Singleton.prototype.GetValue 
= function()
{
    
return this.value;
}
;

Singleton.prototype.SetValue 
= function(value)
{
    
this.value = value;
}
;
</script>

    前面说的"改变它的返回值来实现对象实例的返回",就是指的在JavaScript类的constructor类可以return this.constructor.instance;。所以JavaScript实现的Singleton类在使用时只管new就行了,而不用使用ClassName.Instance或ClassName.GetInstance()这样的语法。

    类Singleton的测试代码如下:
 var singleton = new Singleton();
 alert(__typeof__(singleton));
 alert(singleton.GetValue());
 
var singleton = new Singleton();
 alert(singleton.GetValue());
 singleton.SetValue(
1000000);
 
var singleton = new Singleton();
 alert(singleton.GetValue());
 
var singleton = new Singleton();
 alert(singleton.GetValue());

    返回结果为:Singleton,586606,586606,1000000,1000000。第二个和第三个是random出来的,反正肯定是一样的两个数(__typeof__的实现来自这里:获取JavaScript用户自定义类的类名称)。

posted on 2005-02-27 00:09 birdshome 阅读(2740) 评论(3) 编辑 收藏

评论

#1楼[楼主]  回复 引用 查看   

我的100篇随笔纪念,关于JScript开发
2005-02-27 01:19 | birdshome      

#2楼  回复 引用   

说的很好,很易懂,但是我想问下,单实例模式在js的作用,用途。。。缺乏实际例子说明。
2007-09-15 23:34 | skyey[未注册用户]

#3楼  回复 引用   

var Single=function ()
{
var obj;
return function()
{
if(obj)return obj;
obj=this;
}
}()
Single.prototype={
Name:'张智',
Hello:function()
{
alert(this.Name);
}
}

var s=new Single()
var s2=new Single()
s2.Name="张三";

s.Hello();
s2.Hello();

console.log(s==s2);


我这样算不算,呵呵
2009-03-22 22:21 | 书童[未注册用户]

导航

公告

  原创技术文章和心得,转载必须注明来源"博客园"!
  贴子以"现状"提供,且没有任何担保,同时也没有授予任何权利。
昵称:birdshome
园龄:7年10个月
荣誉:推荐博客
粉丝:73
关注:3

搜索

 

常用链接

我的标签

随笔分类(337)

文章分类(147)

相册

Ex-Colleagues

常用链接

兄弟情深

积分与排名

  • 积分 - 3145044
  • 排名 - 6

最新评论

阅读排行榜

推荐排行榜