Javascript 用于(…阵列中)问题时的Mootools

Javascript 用于(…阵列中)问题时的Mootools,javascript,mootools,Javascript,Mootools,这个问题已经存在好几年了 我正在为一个名为Discuz的论坛引擎编写一些插件,我在自己的项目中使用了很多Mootools。当我将Mootools插入这个论坛引擎(discuz)时,事情变得疯狂 去年我做了一些调试之后,我发现问题在于Mootools原型化了很多核心元素,包括Array,另一方面,这个论坛引擎使用lof For(数组中的I)循环来表示“Array”。这肯定会引起问题,因为 for(i in [1,2,3,4,5]) console.log(i); //0,1,2,3,4 the

这个问题已经存在好几年了

我正在为一个名为Discuz的论坛引擎编写一些插件,我在自己的项目中使用了很多Mootools。当我将Mootools插入这个论坛引擎(discuz)时,事情变得疯狂

去年我做了一些调试之后,我发现问题在于Mootools原型化了很多核心元素,包括Array,另一方面,这个论坛引擎使用lof For(数组中的I)循环来表示“Array”。这肯定会引起问题,因为

for(i in [1,2,3,4,5]) console.log(i);  //0,1,2,3,4 the keys in this array 

**WITH MOOTOOLS
for(i in [1,2,3,4,5]) console.log(i);
//OUTPUT 0,1,2,3,4,$family,$constructor,pop,push,reverse,shift,sort,splice.......
上次我使用解析器更改all for(数组中的i)循环时,添加了一个“if item.hasOwnProperty()”来旁路这些原型 但我认为这是一个非常糟糕的解决办法,因为你知道,这会导致更多的问题…新版本,修改他们的代码…等等

我想知道是否有办法解决这个问题?不接触任何论坛引擎的js代码,还使用Mootools

我知道使用For(…in)For Array是不好的,但我的问题是我不想碰这个论坛引擎的javascript代码,我只想找到一个解决方案来过载这个问题

一些新的浏览器方法,使所有这些额外属性(族、构造函数等)都不可枚举,所以它们不会出现在for-in循环中


然而,如果你想同时支持旧的浏览器,我认为你运气不好:因为in是硬连接语法,所以你不能对它进行修补。(无论如何,神奇的查找替换似乎已经起作用了…

Mootools扩展了
数组.prototype
,甚至可能扩展
对象.prototype
,这可能会干扰。。在循环中,循环枚举所有属性,即使是对象中存在的属性,因为它们出现在原型链的上方。因此,在使用该属性之前,请先测试该属性是否为该对象的直接属性:

for(i in a)
    if (a.hasOwnProperty(i))
        console.log(i);

您应该使用您提到的
hasOwnProperty()
。我不确定您为什么认为这会导致更多问题,事实上,对于(x in y)循环,默认情况下我倾向于使用
hasOwnProperty()
,仅在特殊情况下忽略它


话虽如此,我不会对数组上的(x in y)循环使用
。通常最好使用标准的
for(i=0;iI只是想确保您知道
for in
语句非常不鼓励迭代数组对象,其目的是枚举对象属性,如果您使用简单的顺序循环,问题会少一些(它们也比
for in
语句快)。另请参见:
对象的可能重复。hasOwnProperty(propertyString)
得到了很好的支持,可以用来避免
for..in
循环出现问题。OP已经这样做了。他只是不喜欢修改代码,因为它来自另一个库。