JavaScript:使用Object As Array

时间:2010-10-22 04:23:30

标签: javascript

这样的代码是否有任何陷阱?

var Foo = function() {
    this.bar = function() { return 'bar'; };
};

var f = new Foo();
f[0] = 'hi';
f[1] = 'there';

请注意,我正在创建一个具有一些misc属性的新函数对象,然后我将对象视为一个数组。如何将数组值存储在对象中? 0和1是否被视为属性名称?

3 个答案:

答案 0 :(得分:8)

嗯,是的,01只是两个属性名称。

当您使用括号表示法指定属性时,括号之间的表达式将转换为String,并且该字符串将用作属性名称。

事实上,即使真实数组索引也只是属性:

var realArray = ['a'];
realArray.hasOwnProperty('0'); // true

区别在于每个属性赋值上的实数组对象对应于有效的索引 [1] ,内部跟踪的值他们的length财产。

这就是为什么“子类化”数组对象很困难的原因之一even with the new ECMAScript 5 extensions,或者目前还有提议的ECMAScript-Harmony Proxies 2 3 < / sub>,不能以标准的方式完成。

这可能是个问题,具体取决于您计划迭代数字属性的方式。

如果使用for-in语句枚举属性,则会显示其他成员,而不仅仅是数字属性。

[1]有效数组索引是0到(2 ^ 32)-1范围内的任何无符号32位整数。

答案 1 :(得分:1)

如果您尝试使用for in循环进行循环,我认为您可能会遇到问题;循环也将获得bar。有办法解决这个问题,所以你必须要小心。

答案 2 :(得分:1)

如果您想扩展数组行为,请使用:Array.prototype.yourfunc = function()....