迭代器中..的Javascript原型

Javascript prototype for...in Iterators?

本文关键字:原型 Javascript 迭代器      更新时间:2023-09-26

由于我在这里张贴Mootools使用For(…在数组)的问题,一些javascript框架将原型数组对象,和其他一些代码(论坛引擎)确实使用For…在循环到循环数组中,当我将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…在循环扫描数组类型,只返回值,而不是函数?我不知道如何做到这一点,但我想知道这是否可以做到?

原始代码被破坏…真可惜。

使用Mozilla JavaScript——不要将Mozilla JavaScript扩展与ECMAScript混淆——可以为对象定义自定义迭代器。参见JavaScript 1.7新增功能。然而,在这种情况下,这可能是不实际的。

我的建议是:

    修复代码
    • 应该使用hasOwnProperty进行键迭代,或者;
    • i < arr.length用于数组索引迭代。
  1. 防止mootools干扰内置对象的原型。
    • 参考mootools文档(我不使用mootools)
  2. 使用一个不会扰乱内置对象原型的框架。
    • jQuery不会干扰原型

快乐编码。

将数组存储在一个变量中,然后像这样遍历它:

var items = [1,2,3,4];
for(var i = 0; i < items.length; i++) {
    console.log(i);
}

禁止在阵列上使用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
    }
}

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

原型函数可以很容易地通过"delete"删除,但框架往往依赖于它们,所以这不是一个好主意。

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

不好的是手边没有容易的选择。

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