gpt4 book ai didi

javascript - JavaScript 数组的子类化破坏了快速枚举

转载 作者:行者123 更新时间:2023-11-28 20:52:08 26 4
gpt4 key购买 nike

我使用原型(prototype)对 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(这些数字是数组的索引)。

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

ps:在 Objective C 中为了实现快速枚举,你必须重写一个方法...JavaScript 中有没有特殊的方法可以重写?

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

最佳答案

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

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

关于javascript - JavaScript 数组的子类化破坏了快速枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12251509/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com