您的位置:首页 > Web前端 > JavaScript

只遍历出JScript对象的expando属性

2005-06-24 18:02 239 查看
我们知道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。真是郁闷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



Object.prototype.Clone = function() {};
Object.prototype.Call = function() {};
Object.prototype.OtherMethod = function(){};

var objMap = {};
objMap['abc'] = '1.abc';
objMap['def'] = '2.def';
objMap['ghi'] = '3.ghi';
objMap['jkl'] = '4.jkl';

Display All Expand Attributes Display Expando Attributes

function DisplayMap(map)
{
var values = [];
for ( var key in map )
{
values.push(map[key]);
}
return values;
}

function GetExpandoValues(map)
{
var values = [];
var obj = new objMap.constructor();
for ( var key in map )
{
if ( obj[key] !== map[key] )
{
values.push(map[key]);
}
}
return values;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: