在迭代器中的Javascript原型?

时间:2011-08-12 05:53:09

标签: javascript mootools prototype-programming

由于我在这里发布的问题Mootools when using For(...in Array) problem关于一些javascript框架将原型化Array对象,而其他一些代码(一个论坛引擎)确实使用For ... in循环来循环数组,当我插入javascript框架进入这些现有代码,事情就会出错。

//BEFORE
for(key in [1,2,3,4]) console.log(key)    //0,1,2,3 keys of the array

//After JS Framework
for(key in [1,2,3,4]) console.log(key)    //0,1,2,3,$family,$constructor,pop,push,reverse,shift,sort,splice

鉴于我无法触及包含这些For..In Array循环的原始代码,我也想使用javascript框架(mootools)

我可以解决这个问题吗?原型javascript迭代器??

以某种方式重载For ... In循环,使我的所有javascript For ... in循环扫描数组类型并只返回值而不是函数?我不知道怎么做但我想知道这是否可以做到?

4 个答案:

答案 0 :(得分:2)

原始代码被破坏了......真是太遗憾了。

使用Mozilla JavaScript - 不要将Mozilla JavaScript扩展与ECMAScript 混淆 - 可以为对象定义自定义Iterator。见What's new in JavaScript 1.7。但是,在这种情况下,这可能不实用。

我的建议是:

  1. 修复代码
    • 它应该使用hasOwnProperty进行密钥迭代,或者;
    • i < arr.length用于数组索引迭代。
  2. 让mootools不要弄乱内置对象的原型。
    • 请参阅mootools文档(我不使用mootools)。
  3. 使用不会破坏内置对象原型的框架。
    • jQuery不会弄乱原型。
  4. 快乐的编码。

答案 1 :(得分:1)

不要在数组上使用for (key in array)逻辑。它用于迭代对象属性,而不是迭代数组。如您所见,当您在数组上使用它时,您将获得该数组的所有属性,包括已添加的非本机属性/方法。

您应该使用这种类型的for循环迭代数组:

for (var i = 0; i < array.length; i++) {
     item = array[i];
}

是的,我们不能在数组上使用更短的语法,这似乎是一件令人失望的事情,但这就是语言的方式。

可以尝试使用以下方法解决此问题:

for (key in array) {
    if (array.hasOwnProperty(key)) {
        // operate on array[key] here
    }
}

但是,我不推荐它。使用用于数组的迭代器只是更安全。

答案 2 :(得分:1)

将数组存储在变量中,然后像这样迭代它:

var items = [1,2,3,4];

for(var i = 0; i < items.length; i++) {
    console.log(i);
}

答案 3 :(得分:0)

可以使用“删除”轻松删除原型函数,但框架往往依赖于它们,所以这不是一个好主意。

delete Array.prototype.$family;
delete Array.prototype.$constructor;
delete Array.prototype.pop;
delete Array.prototype.push;
...

糟糕的是手头没有简单的选择。你可以:

  1. 为论坛的脚本文件创建一个解析器,并使用正则表达式在for内添加一个数字键验证(这是高度重要的,但是可以做到这一点)
  2. 创建另一个类Array2并替换整个框架以使用此框架而不是常规数组(这也是一个红色区域,因为您可能需要其他插件)
  3. 做正确的事情并考虑将整个论坛迁移到更灵活的内容