__proto__在哪里添加到数组?

时间:2011-12-29 08:20:51

标签: arrays mootools prototype

曾经能够毫无问题地做到这一点:

for (data in dataArray) { // do some stuff };

现在,它突然迭代了添加到__proto__的{​​{1}}数组。它到底在哪里?这是使用MooTools库吗?它打破了我所有的循环! :P现在我必须这样做:

dataArray

我不明白的是为什么这个有用...... for (var i=0; i < dataArray.length; i++) { // do some stuff }; 实际上不算作数组元素?如果没有,那么为什么第一个版本不像以前那样工作,但第二个版本呢?

TIA打开灯......

WR!

1 个答案:

答案 0 :(得分:3)

没有。 javascript是典型的。它意味着可以通过修改其原型来扩展任何(任何本机类型)。例如,如果你想添加一个允许你迭代你以后可能创建的任何数组的新方法,你可以这样做:

Array.prototype.each = function(callback) {
    // this == the array. code here...
    return this;
};

这意味着创建的任何数组都将支持.each:[].each(function(el) {});。是的,mootools是一个重要的典型框架。事情随着mootools牛奶的变化而变化,这就是AMD - 因此没有扩大当地人......

但是,最终,在javascript中,一切都通过原型链从Object native继承。

对于Array来说,它并不是一个真正的数组类型 - 在javascript中,它更像是一个具有类数数组属性的Object。这让我想到你遇到问题的原因:

for (var foo in obj)实际上是一种循环Objects - 而非Arrays的方式。它也适用于数组,因为它们就像我提到的对象一样。

但这是错误的做法,特别是当你使用原型框架或者你不确定你运行的所有代码以及它如何影响原型链时。如果你的意思是在其他语言中使用所谓的“关联数组”,只需使用一个Object。

在mootools中,您可以使用Object.each(function(value, key) {});来迭代它们。

或者:在循环中检查项目hasOwnProperty

for (var data in dataArray) {
    if (dataArray.hasOwnProperty(data)) {
        // avoids working with prototype.
    }
}