0

我以这种方式使用原型对 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”的真实实现略有不同,但我贴出的代码足以产生异常的快速枚举循环。不要问我为什么要扩展 Array,我有我的正当理由;)

4

1 回答 1

3

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

在最新的浏览器中,您可以使用Object.defineProperties()方法创建属性并指定属性是否可枚举,但这并不意味着使用 枚举数组的元素是正确的for (var x in obj)。应该始终使用这种类型的形式来迭代数组元素:for (var i = 0, len = arr.length; i < len; i++)或内置的迭代器,如array.forEach(callback [, thisArg]).

于 2012-09-03T16:49:42.917 回答