子类化JavaScript数组会破坏快速枚举

时间:2012-09-03 16:40:07

标签: javascript oop fast-enumeration

我正在使用原型对Array进行子类化,这样:

MyArray = function()
{
   Array.apply(this, arguments);
};

MyArray.prototype = new Array();

所有工作正常,我可以用这种方式初始化“MyArray”实例:

var arr = new MyArray();
arr.push(1, 2, 3);

问题是MyArray实例的快速枚举被破坏,实际上是以下循环:

for (var i in arr)
{
   console.log(i);
}

打印:0,1,2,长度

实际上,类的每个方法/属性都包含在枚举中。 在普通数组中,代码只打印0,1,2(这些数字是数组的索引)。

所以......我的问题是:如何通过保留快速枚举来扩展Array?

ps:在Objective C中为了实现快速枚举,你必须覆盖一个方法......在JavaScript中是否有一种特殊的覆盖方法?

注意:显然我的“MyArray”的实际实现略有不同,但我发布的代码足以生成异常的快速枚举循环。不要问我为什么要扩展数组,我有正当理由;)

1 个答案:

答案 0 :(得分:3)

不应该使用for (var x in obj)枚举数组元素,因为它会迭代对象的可枚举属性,而不仅仅是数组元素,正如您所看到的,它可以包含除数组元素之外的内容。此外,这种迭代方法不保证以任何给定的顺序返回属性,因此您的数组元素可能不是正确的顺序。

在最新的浏览器中,您可以使用Object.defineProperties() method创建属性并指定属性是否可枚举,但这并不意味着使用{{1枚举数组的元素始终是正确的}}。应该总是使用这种类型的表单来迭代数组元素:for (var x in obj)或像array.forEach(callback [, thisArg])这样的内置迭代器。