Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
子类化JavaScript数组打破了快速枚举_Javascript_Oop_Fast Enumeration - Fatal编程技术网

子类化JavaScript数组打破了快速枚举

子类化JavaScript数组打破了快速枚举,javascript,oop,fast-enumeration,Javascript,Oop,Fast Enumeration,我使用prototype对数组进行子类化,方式如下: MyArray = function() { Array.apply(this, arguments); }; MyArray.prototype = new Array(); var arr = new MyArray(); arr.push(1, 2, 3); 所有这些都可以正常工作,我可以用以下方式初始化“MyArray”实例: MyArray = function() { Array.apply(this, argu

我使用prototype对数组进行子类化,方式如下:

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

MyArray.prototype = new Array();
var arr = new MyArray();
arr.push(1, 2, 3);
所有这些都可以正常工作,我可以用以下方式初始化“MyArray”实例:

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

MyArray.prototype = new Array();
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:在目标C中,为了实现快速枚举,您必须重写一个方法。。。在JavaScript中是否有要重写的特殊方法


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

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


在最新的浏览器中,您可以使用创建属性并指定属性是否可枚举,但这并不意味着使用
for(obj中的var x)
枚举数组元素是正确的。应该始终使用这种类型的表单来迭代数组元素:
for(var i=0,len=arr.length;i
或类似的内置迭代器。

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


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

。另外,这在JavaScript中不是“快速枚举”,事实上,对于数组实例,最好称为“不正确枚举”:-(这是“不正确的”,因为规范甚至不能保证您将编号的属性按顺序恢复。)@为了让我接受你的评论,你能把你的评论作为回答吗jfriend00基本上说了同样的话,他也输入了所有有用的东西:-)。另外,这在JavaScript中不是“快速枚举”,事实上,对于数组实例,最好称为“不正确枚举”:-(这是“不正确的”,因为规范甚至不能保证您将编号的属性按顺序恢复。)@为了让我接受你的评论,你能把你的评论作为回答吗jfriend00基本上说了同样的话,他也输入了所有有用的东西:-)@JaredFarrish-我的意图是直接通过数字索引进行迭代的任何形式。Once可以使用在两个索引值之间迭代的任何形式的循环
while()
也可以,如果它通过
.length
迭代数值索引值和确定边界。我通常使用for/in来迭代“normal”数组,我没有问题,返回的元素顺序正确,并且没有返回“额外属性”。。。你能证明我的相反观点吗?@daveoncode-order不受ECMA规范的保证,这种类型的迭代并不适用于有序数组。如果你想继续这样做,我不太明白为什么,但请继续。当我第一次发现这一点时,我改变了我的方法,因为对我来说,安全、可靠的代码比保存几个键入字符更重要。此外,如果您或从事您的项目的其他人曾经包含一个向数组对象添加某些方法的库,那么您的所有代码都可能突然中断。为什么要以危险的方式编程?“这太不明智了。”贾雷德法里什-我的意图是直接通过数字索引进行迭代的任何形式。Once可以使用在两个索引值之间迭代的任何形式的循环
while()
也可以,如果它通过
.length
迭代数值索引值和确定边界。我通常使用for/in来迭代“normal”数组,我没有问题,返回的元素顺序正确,并且没有返回“额外属性”。。。你能证明我的相反观点吗?@daveoncode-order不受ECMA规范的保证,这种类型的迭代并不适用于有序数组。如果你想继续这样做,我不太明白为什么,但请继续。当我第一次发现这一点时,我改变了我的方法,因为对我来说,安全、可靠的代码比保存几个键入字符更重要。此外,如果您或从事您的项目的其他人曾经包含一个向数组对象添加某些方法的库,那么您的所有代码都可能突然中断。为什么要以危险的方式编程?这太不聪明了。