【问题标题】:Javascript prototype for...in Iterators?用于...在迭代器中的 Javascript 原型?
【发布时间】:2011-08-12 05:53:09
【问题描述】:

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

//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 Iterator 的原型??

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

【问题讨论】:

  • 原码被破解了……真是可惜了。
  • 叹息。扩展数组没问题。 perfectionkills.com/…。但是,通过 for ... in 构造循环数组(意在用于 OBJECTS)是错误的。它可以工作,因为数组实际上是具有类似数组属性的对象,但您应该酌情使用普通的for 循环、Array.eachObject.each。如果您必须使用for .. in,请务必检查hasOwnProperty

标签: javascript mootools prototype-programming


【解决方案1】:

原来的代码被破解了……真是可惜了。

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

我的建议是:

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

编码愉快。

【讨论】:

  • suggestion 3,为什么会有问题?如果您物有所值,那么让您的代码与 mootools 一起正常运行就不会有问题。 mootools 仅以符合 ES5 规范的方式扩展/填充原生对象,偏差和添加实际上是边缘情况。不知道如何循环数组并不构成 mootools 的缺点,imo。它不一定是 mootools,任何东西都可能影响 protos。对于suggestion 2,mootools 2.0 将有一个“卸载”功能,可以删除所有主机和本机对象扩展,尽管它尚不可用。
  • @Dimitar Christoff 我按照我的建议顺序编写了项目符号,最后使用了另一个库。最初的限制之一是原始代码是不可 可更改的(尽管我的第一个建议是无论如何都要修复它;-)。我对 mootools 2.0 的“非侵入式模式”表示赞赏——虽然假设世界在 ECMAScript ed.5 上普遍运行会很好,但它还没有而且很遗憾暂时不能保证:-/ user608886发布了一个涉及删除原型方法的答案(这在其他方面可能非常有害,我不知道)。
【解决方案2】:

将数组存储在一个变量中,然后像这样对其进行迭代:

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

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

【讨论】:

    【解决方案3】:

    不要在数组上使用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
        }
    }
    

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

    【讨论】:

      【解决方案4】:

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

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

      它的坏处是手头没有简单的选择。您可以:

      1. 为论坛的脚本文件创建一个解析器,并在 for 中添加一个数字键验证,使用正则表达式(这是非常繁琐但可以解决问题)
      2. 创建另一个类 Array2 并替换整个框架以使用这个类而不是常规数组(这也是繁琐的,因为您以后可能需要其他插件)
      3. 做正确的事,考虑将整个论坛迁移到更灵活的地方

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-12-19
        • 1970-01-01
        • 2015-09-22
        • 2020-10-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多