KiMoGiGi 技术文集
不在乎选择什么,而在乎坚持多久……
IT博客
首页
联系
聚合
管理
185 Posts :: 14 Stories :: 48 Comments :: 0 Trackbacks
公告
KiMoGiGi 技术文集
注:本Blog技术文章
除特别说明外
全部均来源Web和转载
最近正在看的
(图片来源
China-Pub
):
常用链接
我的随笔
我的评论
我参与的随笔
留言簿
(10)
给我留言
查看公开留言
查看私人留言
随笔分类
(219)
AJAX.NET(5)
ASP.NET(38)
Basic(7)
C# / Winforms(64)
Enterprise Library(3)
Java(1)
JavaScript(35)
Python(4)
Web小技巧(19)
WPF/SilverLight(4)
工具插件(6)
数据库相关(7)
经验之谈(24)
网络编程(2)
随笔档案
(185)
2011年3月 (1)
2010年11月 (1)
2010年8月 (1)
2010年6月 (2)
2009年10月 (1)
2009年9月 (9)
2009年7月 (1)
2009年5月 (2)
2009年3月 (6)
2009年2月 (3)
2009年1月 (7)
2008年12月 (6)
2008年11月 (5)
2008年10月 (3)
2008年9月 (1)
2008年8月 (5)
2008年7月 (10)
2008年6月 (9)
2008年5月 (6)
2008年4月 (5)
2008年3月 (6)
2008年2月 (1)
2008年1月 (4)
2007年12月 (11)
2007年11月 (11)
2007年10月 (2)
2007年8月 (1)
2007年4月 (4)
2007年3月 (11)
2007年2月 (3)
2007年1月 (10)
2006年12月 (12)
2006年11月 (6)
2006年10月 (3)
2006年8月 (3)
2006年7月 (5)
2006年6月 (8)
文章分类
(25)
ASP.NET(8)
Basic Knowledge(1)
C#(4)
JavaScript
Web设计
开源框架 - NHibernate
数据库相关
经验之谈
英文文章翻译(12)
文章档案
(14)
2008年8月 (1)
2008年6月 (2)
2007年12月 (4)
2007年11月 (7)
收藏夹
JavaScript
Friend 's Blog
My Step
映画记录
技术崇拜
A JavaScript Fancier
Dflying
dudu
First we try, then we trust
lifesinger
淘宝网UED部-Web前端
TerryLee's Tech Space
听棠.NET
周爱民
职业生涯顾问Leo的专栏
鸟食轩
技術網站
C# Corner
codeplex
CSDN
博客園
数据结构
點部落
搜索
只遍历出JScript对象的expando属性
我们知道JScript的对象(不只是Object)可以像html元素对象一样,添加任意的自定义属性值。也就是说JScript的对象,天生都是Key/Value map。并且这种map结构由于使用Native的代码实现,检索效率非常之高,我曾在
这篇
文章里讨论过。不过在遍历这样的map时,expando导入属性和prototype导入属性存在了混淆。
由于JScript的prototype特性对对象的扩充非常的方便,所以我们在制作一些JScript类库的时候,一般都会使用prototype特性为对象添加方法,比如我们对Object进行如下prototype扩充:
Object.prototype.Clone
=
function
() {};
Object.prototype.Call
=
function
() {};
Object.prototype.OtherMethod
=
function
(){};
这个时候如果再使用Object作为map结构来使用,我们就会遇到遍历这个map的错误,看下面的代码:
var
objMap
=
{};
objMap['abc']
=
'
1
.abc';
objMap['def']
=
'
2
.def';
objMap['ghi']
=
'
3
.ghi';
objMap['jkl']
=
'
4
.jkl';
遍历这个集合:
function
DisplayMap(map)
{
var
values
=
[];
for
(
var
key
in
map )
{
values.push(map[key]);
}
return
values;
}
Display(objMap);
我们发现,在values里的值居然是:
function
(){},
function
() {},
function
() {},
1
.abc,
2
.def,
3
.ghi,
4
.jkl。
真是郁闷
! 其实这就是
for in
语句的效果,JScript也就是这么设计的,我们没有办法改变。那么我门能不能只取出objMap中expando进去的属性呢?
由于prototype属性的优先级很高,在对象实例生成的时候就expand到对象实例中去了。所以我们建立的任何一个对象,都会包含相同的prototype属性。这样一来就好办了,我们把objMap中的prototype属性找出来过滤掉就行了呗。参考代码如下:
function
GetExpandoValues(map)
{
var
values
=
[];
var
obj
=
new
map.constructor();
for
(
var
key
in
map )
{
if
( obj[key]
!==
map[key] )
{
values.push(map[key]);
}
}
return
values;
}
GetExpandoValues(objMap);
获得结果为:1.abc,2.def,3.ghi,4.jkl
。
Display All Expand Attributes
Display Expando Attributes
posted on 2006-12-03 01:15
KiMoGiGi
阅读(300)
评论(0)
编辑
收藏
引用
所属分类:
JavaScript
只有注册用户
登录
后才能发表评论。
Powered by:
IT博客
Copyright © KiMoGiGi