怎样在自己的对象里实现collection?

hax 2002-06-20 11:25:46
浏览器对象里包含许多collection,例如all、children之类。实际上就是一些对象的集合。

所有的collection都包括属性length、方法item()。
item方法的参数可以是数字,也可以是指定名字的字符串。而且all.item(p)也可以写成all(p)。

可是我不知道这些在js里是怎么实现的?JS好像不支持重名函数呀?而且也没见过对象可以像函数那样使用?

不知道IE和Netscape的DHTML文档模型是如何符合JS规范的?如果符合,我也能构造出类似的collection对象呀……
...全文
55 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
hax 2002-06-23
  • 打赏
  • 举报
回复
Lostinet的代码促使我再次看了一遍core JS guide 1.5。因为其中的[a,b, c, d]的数组写法,嵌套function等在微软的JScript里都没有提到(不过都支持的)。
另外的发现,还有arguments的用法,使得可以用变长参数。hehe,以前都没注意。
还有例如用function(x) { this.x = x || "default value" }就可以设置对象属性的缺省值。
emu 2002-06-21
  • 打赏
  • 举报
回复
呵呵,试了一下,做不出来一模一样的,比如all可以通过all(index)或者all[index]来访问,自己做的就只能myCollection[index]。

要模仿得非常象是能做到的,完全一样也未必有必要,要看具体需求了。
xg_delayth 2002-06-21
  • 打赏
  • 举报
回复
很有意思,在oracle中我也有类似性质的事情。
如果能有一个确切的回答,将获易不少,就算给你up一下吧!
Lostinet 2002-06-21
  • 打赏
  • 举报
回复
支持all的:
IHTMLDocument2
IHTMLElement
sunbeamy 2002-06-21
  • 打赏
  • 举报
回复
Lostinet(_L_)(思考太多-走火入魔)(_L_) 兄的写法总是独树一帜,我也来凑个热闹吧,感觉其实是Array,而不是Collection
////////////////////////////////////////////////////////////////////
function Collection(){
var length = 0

//+--------------------------------------------
this.add = function(oElement){
length ++
this[length] = oElement
}

//+---------------------------------------------
this.length = function(){
return length
}

//+---------------------------------------------
this.item = function(iIndex){
return this[iIndex]
}

//+----------------------------------------------


}

var c = new Collection()
c.add("a")
c.add("b")
c.add("c")
alert(c[2])
alert(c.item(2))
alert(c.length())
hax 2002-06-21
  • 打赏
  • 举报
回复
代码好像不错,我明天研究一下。
emu 2002-06-21
  • 打赏
  • 举报
回复
好,够巧妙的。
Lostinet 2002-06-21
  • 打赏
  • 举报
回复
可惜 obj.length 是JScript保留的。所以只能用大写了。

function Collection(inarr)
{
var undefined;
var arr=[];
Index._SetArray(inarr);
return Index;
function Index(index)
{
return Index[index];
}
function Index.Item(index)
{
return Index(index);
}
function Index._SetArray(inarr)
{
for(var i=0;i<arr.length;i++)
Index.Item[i]=Index[i]=undefined;
if(inarr)arr=inarr.concat();
else arr=[];
for(var i=0;i<arr.length;i++)
Index.Item[i]=Index[i]=arr[i];
Index.Length=arr.length;
}
}
var coll=new Collection(["a","b","c","d"]);
alert(coll.Length);
alert(coll[0]+":"+coll.Item[1]+":"+coll(2)+":"+coll.Item(3))
emu 2002-06-20
  • 打赏
  • 举报
回复
书上说all也适用于object的,但是试了一下好像不行(未定义),不知是否我的书太超前了。这样也好,可以自己来定义。

这个问题很有意思,可是我再不下线就要向万恶的中国电信交税了......

87,910

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧