当前页面: 开发资料首页 → Javascript 专题 → 在JavaScript中建立自己的集合对象
摘要: 在JavaScript中建立自己的集合对象
<table cellSpacing=0 cellPadding=0 width=600 border=0>
集合对象——在Perl中称之为联合数组——提供了一种用来在存储器中保存和提取数据项的方法;该方法基于一种提供“关键字——数值(value)”对的数据结构上。你可以根据数据项的关键字进行插入和提取操作,每个数据项的关键字都是独有的、互不重复的。“关键字——数值”对使得集合在处理查找工作时是特别有用。另外,关键字的单值性提供标记关键字或者说检查关键字是否唯一的能力。
集合并不是一个新的概念,除了Perl之外,许多语言都支持它,如VBScript和Visual Basic。但是如果你想在JavaScript中使用集合对象,你就没那么走运了。JavaScript的5.0以及5.0之前的版本都不支持集合对象——除非你自己建立它们。我将在VBScript用集合对象来建立一个等效的模型,然后用JavaScript实现它。
看看用VBScript实现的模型
当用server-side VBScript编写代码时,我通常用集合对象来处理例行任务,如管理一个小的数据库。举例来说,假定有两个数据库表,一个用来存放某公司销售的零件现货清单,另一个用于存放生产地址,如图A所示。
Figure A
是不是看起来很简单?但是假定由于某些原因,你所需要的零件信息已经存在于一个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(关键字)
把一个数据项和一个关键字对应上。
返回关键字对应的数据项。
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.objCollection、 this.count和this.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
除了包括这三个属性外,我们的这个集合对象还拥有六个方法:this.add、 this.exists、 this.item、this.removeAll、 this.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
}
类似与add方法,其它方法也需要它们自己的定义和函数。一旦完成这些方法的定义和函数,我们可以试一试我们的集合对象。为了简明起见,我将跳过其它函数方法的定义过程而简单的介绍JavaScript的新建集合对象的方法。第一个任务就是建立一个本对象的实例:
var colFactory = new collection(); // 建立一个实例
一旦建立了集合对象的实例,添加数据项就是一件简单的事情了。回到前面的报表例子,填写集合的任务可以用清单E中的几行代码轻松搞定。
while(!rstFty.EOF) {
colFactory.add(rstFty.Field('factory_nbr').Value,rstFty.Field('name').Value);
rstFty.MoveNext
}
你可以只用一行代码就可以获得厂商名字:
strFactoryName = colFactory.item(strFactoryNumber);
总结
通过用VBScript来建模的优势,你可以建立自己的集合对象以弥补JavaScrpt不支持集合对象的缺点。只需以少量代码为代价,你就可以在JavaScript中使用集合了。
</td></tr></table> </td> </tr> <tr> <td vAlign=top align=left height="100%">