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就是一个普通的函数,我们可以改变它的返回值来实现对象实例的返回,而不依赖于语言机制。这是到底是什么意思呢 emquestion.gif 先看一下JS的Singleton类的实现就明白了,示例代码如下:
ExpandedBlockStart.gif < script  language ="javascript" >
InBlock.gif
function  Singleton()
ExpandedSubBlockStart.gif
{
InBlock.gif    
//  template code for singleton class.
InBlock.gif
     if  (  this .constructor.instance )
ExpandedSubBlockStart.gif    
{
InBlock.gif         
return   this .constructor.instance;
ExpandedSubBlockEnd.gif    }
 
InBlock.gif    
else   this .constructor.instance  =   this ;
ExpandedSubBlockStart.gif    
/**/ // ///////////////////////////////
InBlock.gif
    
InBlock.gif    
this .value  =  parseInt(Math.random() * 1000000 );
InBlock.gif   
InBlock.gif    
this .toString  =   function ()
ExpandedSubBlockStart.gif    
{
InBlock.gif         
return  '[class Singleton]';
ExpandedSubBlockEnd.gif    }

ExpandedSubBlockEnd.gif}

InBlock.gif
InBlock.gifSingleton.prototype.GetValue 
=   function ()
ExpandedSubBlockStart.gif
{
InBlock.gif    
return   this .value;
ExpandedSubBlockEnd.gif}
;
InBlock.gif
InBlock.gifSingleton.prototype.SetValue 
=   function (value)
ExpandedSubBlockStart.gif
{
InBlock.gif    
this .value  =  value;
ExpandedBlockEnd.gif}
;
None.gif
</ script >

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

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

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


本文转自博客园鸟食轩的博客,原文链接:http://www.cnblogs.com/birdshome/,如需转载请自行联系原博主。

目录
相关文章
|
2月前
|
JavaScript
js开发:请解释什么是ES6的类(class),并说明它与传统构造函数的区别。
ES6的类提供了一种更简洁的面向对象编程方式,对比传统的构造函数,具有更好的可读性和可维护性。类使用`class`定义,`constructor`定义构造方法,`extends`实现继承,并可直接定义静态方法。示例展示了如何创建`Person`类、`Student`子类以及它们的方法调用。
23 2
|
2月前
|
JavaScript 前端开发
js开发:请解释原型继承和类继承的区别。
JavaScript中的原型继承和类继承用于共享对象属性和方法。原型继承利用原型链查找属性,节省内存但不支持私有成员。类继承通过ES6的class和extends实现,支持私有成员但占用更多内存。两者各有优势,适用于不同场景。
20 0
|
2月前
uni-app 65egg.js聊天类chat.js封装(二)
uni-app 65egg.js聊天类chat.js封装(二)
28 1
|
4月前
|
存储 前端开发 JavaScript
揭秘原型链:探索 JavaScript 面向对象编程的核心(下)
揭秘原型链:探索 JavaScript 面向对象编程的核心(下)
揭秘原型链:探索 JavaScript 面向对象编程的核心(下)
|
4月前
|
前端开发 JavaScript 开发者
揭秘原型链:探索 JavaScript 面向对象编程的核心(上)
揭秘原型链:探索 JavaScript 面向对象编程的核心(上)
揭秘原型链:探索 JavaScript 面向对象编程的核心(上)
|
4月前
|
存储 JavaScript 前端开发
构造函数和原型的结合应用:轻松搞定JS的面向对象编程(三)
构造函数和原型的结合应用:轻松搞定JS的面向对象编程
|
4月前
|
设计模式 JavaScript 前端开发
构造函数和原型的结合应用:轻松搞定JS的面向对象编程(一)
构造函数和原型的结合应用:轻松搞定JS的面向对象编程
|
5月前
|
JavaScript 前端开发 安全
从0开始学习JavaScript--JavaScript 类和模块详解
JavaScript的类和模块是现代Web开发中的重要组成部分,它们提供了一种更面向对象的编程方式和模块化的组织代码方式。本文将深入探讨JavaScript中类和模块的各个方面,并通过丰富的示例代码来帮助大家更好地理解和运用这些概念。
|
4月前
|
存储 JavaScript 前端开发
构造函数和原型的结合应用:轻松搞定JS的面向对象编程(二)
构造函数和原型的结合应用:轻松搞定JS的面向对象编程
|
7天前
|
JavaScript 前端开发
【JavaScript技术专栏】JavaScript中的面向对象编程
【4月更文挑战第30天】本文介绍了JavaScript中的面向对象编程,包括对象的基本概念、创建对象的方法(字面量、构造函数、Object.create()和ES6的class)及继承机制(原型链和ES6的class继承)。面向对象编程通过抽象为对象,实现了代码复用和模块化,提高了程序的可读性和可维护性。