如果你需要在客户端做许多管理对象,那么你可能已经使用了微软的Scripting.Dictionary.ActiveX对象。然而,如果你像我那样希望可以更多的控制集合并让它的运行速度变得更快,那么你可以用JavaScript创建自己的Collection类。这样做的好处除了加快速度外,你还可以按照自己的需要而定制它。由于我只需要一个管理工具,因此我仅需要添加和删除集合中的条目以及返回集合中的条目的函数。或许我有点舒服惯了,因此我希望可以通过使用用户定义的关键字来找回我所需的条目。
首先,我需要知道集合应该能够提供哪些功能。我想通过关键字来访问到所有我的条目,而这一功能的基础就是一个关联数组(associative array),但我又希望可以用一种简单的方法来管理所有这些信息,就像下面那样:
var var1 = Collection.Item("key").Value;
这非常容易创建。我所需要的是一个可以在其“Value”属性中存储信息的Item对象。我将把所有Item保存到Collection对象的一个数组中去,因此我需要给Item对象添加一个新的属性“Index”,它用于跟踪条目(item)在数组中的索引。这样,到目前为止,我们的代码(为了简明起见,我没有添加任何错误处理代码)如下所示:
function Item(pvThing) {
this.Value = pvThing;
this.Index = -1;
}
我本来可以在Item类定义中添加更多的函数的,但目前我暂时不需要这么做。现在,我们已经有了一个类,我们可以用它所创建的对象来存储信息,我们需要做的是创建一个Collection类来保存这个Item集合。我们还需要用一个叫着“all”的数组属性来保存所有的Item,并且添加另一个属性“aall”来存储它们的关键字索引,这样这两个数组是互相关联的。处于简明起见,我还添加了一个叫着“length”的属性来保存集合中Item的数量。
Collection的类定义如下所示:function Collection() {
this.all = [];
this.aall = {};
this.length = 0;
}
我需要一个向例化的Collection添加Item的方法,我们把这个方法命名为“Add”。Add方法可以给新插入的Item创建一个关键字。此外,现在我还希望限制新插入到Collection的条目为Item类型的条目。下面是该方法的代码:
this.Add = function (poItem, pvKey) {
if (typeof(poItem) == "object" &&
poItem.constructor == Item) {
varidx = this.all.push(poItem)
- 1; // IE 5.5中新添加了这个‘push’方法
if (this.all[idx].Index
= -1) {
this.all[idx].Index
= idx;
}
if (typeof(pvKey)
!= "undefined") {
this.all[idx].Key
= pvKey;
this.aall[pvKey]
= this.all[idx];
this.length =
this.all.length;
} else {
alert("Item
must be an Item object.");
}
}