站内搜索: 请输入搜索关键词

当前页面: 开发资料首页Javascript 专题在JavaScript中建立自己的集合对象

在JavaScript中建立自己的集合对象

摘要: 在JavaScript中建立自己的集合对象


<table cellSpacing=0 cellPadding=0 width=600 border=0> <tr> <td align=middle width=600 colSpan=3 height=18>

在JavaScript中建立自己的集合对象

</td></tr> <tr> <td width=600 colSpan=3>

集合对象——在Perl中称之为联合数组——提供了一种用来在存储器中保存和提取数据项的方法;该方法基于一种提供“关键字——数值(value)”对的数据结构上。你可以根据数据项的关键字进行插入和提取操作,每个数据项的关键字都是独有的、互不重复的。“关键字——数值”对使得集合在处理查找工作时是特别有用。另外,关键字的单值性提供标记关键字或者说检查关键字是否唯一的能力。

集合并不是一个新的概念,除了Perl之外,许多语言都支持它,如VBScript和Visual Basic。但是如果你想在JavaScript中使用集合对象,你就没那么走运了。JavaScript的5.0以及5.0之前的版本都不支持集合对象——除非你自己建立它们。我将在VBScript用集合对象来建立一个等效的模型,然后用JavaScript实现它。

看看用VBScript实现的模型

当用server-side VBScript编写代码时,我通常用集合对象来处理例行任务,如管理一个小的数据库。举例来说,假定有两个数据库表,一个用来存放某公司销售的零件现货清单,另一个用于存放生产地址,如图A所示。

Figure A


假设你必须建立一个基于Web的报表(report),其中包括零件数量、说明以及生产商地址。你可能会编写类似于下面的SQL语句。 <table cellSpacing=1 cellPadding=0 width="100%" bgColor=#f2e0c1 border=0> <tr> <td width="100%">SELECT p.part_nbr,p.description,f.name FROM tblPart p,tblFactory f WHERE p.factory_nbr = f.factory_nbr ORDER BY part_nbr ASC</td></tr></table>

是不是看起来很简单?但是假定由于某些原因,你所需要的零件信息已经存在于一个ADO记录集(recordset)。例如,你需要用零件表的信息来生成代理报表(commission report),你该怎么办呢?无论怎样,你都可以用代码清单A中的SELECT语句,或者循环查找零件记录集并对每个零件记录使用SELECT语句来获取生产商的名字。这两种方法都是可行的,不过,访问存储设备可是脚本所能实现的工作中最耗时的一种。在遇到这种情况的时候,我一般用SELECT语句获得厂商名和厂商代号的,如

<table cellSpacing=1 cellPadding=0 width="100%" bgColor=#f2e0c1 border=0> <tr> <td width="100%">SELECT factory_nbr,name FROM tblFactory</td></tr></table>

用JavaScript实现自己的集合

现在你应该了解本模型如何在VBScript中工作的,现在让我们看看JavaScript是怎么实现的。正如我早先所提到的,集合对象按关键字存储数据项。在本例中,关键字为厂商代号,厂商名字为数据项。

为了易用起见,我从VBScript中选择了字典对象来作为模型,它实现了表A所示的方法。

表A

<table borderColor=#000000 cellSpacing=0 borderColorDark=#ffffff cellPadding=0 border=1> <tr> <td bgColor=#e6e6e6>

方法/属性

</td> <td bgColor=#e6e6e6>

例子

</td> <td bgColor=#e6e6e6>

说明

</td></tr> <tr> <td>

add

</td> <td>

object.add(关键字,数据项)

</td> <td>

在集合中添加一个“关键字——数据项”对。

</td></tr> <tr> <td>

count

</td> <td>

object.count

</td> <td>

返回集合中数据项的数目。

</td></tr> <tr> <td>

exists

</td> <td>

object.exists(关键字)

</td> <td>

如果关键字存在,返回“真”,否则返回“假”。

</td></tr> <tr> <td>

Item

</td> <td>

object.item(关键字, 数据项)
object.item(关键字)

</td> <td>

把一个数据项和一个关键字对应上。
返回关键字对应的数据项。

</td></tr> <tr> <td>

removeAll

</td> <td>

object.removeAll()

</td> <td>

删除集合中所有的“关键字——数据项”对。

</td></tr> <tr> <td>

remove

</td> <td>

object.remove(关键字)

</td> <td>

删除本“关键字——数据项”对。

</td></tr> <tr> <td>

keys

</td> <td>

object.keys()

</td> <td>

返回一个包含所有关键字的数组。

</td></tr></table>

为了在JavaScript中创建集合,你需要使用构造函数。在JavaScript的5.0以及更早的版本中,构造函数的书写和使用方式与Visual Basic(或者其它支持对象的语言)的类的构造函数相同。集合例化的方式考虑了构造函数的用途。构造函数的方法和属性的定义把JavaScript构造函数从JavaScript普通函数中区分开来。

在写构造函数时,你可以用关键字this来访问对象的属性和方法。构造函数的任务就是初始化对象、属性(property)以及方法。我们的集合对象来有三个属性:this.objCollectionthis.countthis.error。从清单C所摘录的代码中,我们可以看出构造函数中,属性的定义大概是个什么样子。

<table cellSpacing=1 cellPadding=0 width="100%" bgColor=#f2e0c1 border=0> <tr> <td width="100%">清单C

:this.objcollection = new Object; // Associative array
this.count = 0; // Total numbers of items
this.error = false; // Error indicator

</td></tr></table>

除了包括这三个属性外,我们的这个集合对象还拥有六个方法:this.addthis.existsthis.itemthis.removeAllthis.remove以及this.keys。这些方法的定义与属性的定义方法相似,区别在于:方法的目的在于揭示函数。所以在add方法中,你需要清单D所示的代码。

<table cellSpacing=1 cellPadding=0 width="100%" bgColor=#f2e0c1 border=0> <tr> <td width="100%">清单D:

this.add = colAdd; // Add method

void function colAdd(strKey,strItem) {
/* Function: colAdd
Creation Date: August 16, 2002
Programmer: Edmond Woychowsky
Purpose: The purpose of this function is to add an item to the collection object.
Update Date: Programmer: Description:
*/

this.error = false; // Default successful

if(typeof(this.objcollection[strKey]) == 'undefined') {
++this.count;

this.objcollection[strKey] = strItem;
} else
this.error = true; // Error
}

</td></tr></table>

类似与add方法,其它方法也需要它们自己的定义和函数。一旦完成这些方法的定义和函数,我们可以试一试我们的集合对象。为了简明起见,我将跳过其它函数方法的定义过程而简单的介绍JavaScript的新建集合对象的方法。第一个任务就是建立一个本对象的实例:
var colFactory = new collection(); // 建立一个实例

一旦建立了集合对象的实例,添加数据项就是一件简单的事情了。回到前面的报表例子,填写集合的任务可以用清单E中的几行代码轻松搞定。

<table cellSpacing=1 cellPadding=0 width="100%" bgColor=#f2e0c1 border=0> <tr> <td width="100%">清单E:

while(!rstFty.EOF) {

colFactory.add(rstFty.Field('factory_nbr').Value,rstFty.Field('name').Value);
rstFty.MoveNext
}

</td></tr></table>

你可以只用一行代码就可以获得厂商名字:
strFactoryName = colFactory.item(strFactoryNumber);

总结

通过用VBScript来建模的优势,你可以建立自己的集合对象以弥补JavaScrpt不支持集合对象的缺点。只需以少量代码为代价,你就可以在JavaScript中使用集合了。

</td></tr></table>

</td> </tr> <tr> <td vAlign=top align=left height="100%">
↑返回目录
前一篇: JScript5.5下String.prototype.replace(str,func)的UBB嵌套的递归解开。
后一篇: 可预览缩略图(实时预览)的上传图片界面