2011-08-12 53 views
4

這個問題已經存在了幾年了。使用For(...在陣列中)時的Mootools問題

我正在爲論壇引擎編寫一些名爲Discuz的插件,我在自己的項目中使用了很多Mootools。當我將Mootools插入這個論壇引擎(discuz)的時候,事情變得很瘋狂......

去年我做了一些調試之後,發現問題是Mootools原型化了很多核心元素,包括Array,以及on另一方面,這個論壇引擎在數組中使用了一個For(i in 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....... 

我最後一次使用解析器來改變所有(我在陣列)循環增加,這將造成一定的問題,「如果item.hasOwnProperty()」,由傳遞這些原型 但我認爲這是一個非常糟糕的變通原因你知道,造成更多的問題......新版本的bug他們的代碼...等

我不知道是否有周圍的工作解決售後服務這個問題?沒有觸及任何這個論壇引擎的js代碼,也使用Mootools?

我知道,使用(..中)數組是壞的,但我的問題是,我不想碰這個論壇引擎的JavaScript代碼,我只是想解決過載問題

+0

我只是想確保你知道'for-in'語句非常不鼓勵**遍歷數組對象,它的目的是**枚舉**對象的屬性,如果你使用簡單的順序循環,你會遇到更少的問題(它們也比'for-in'快)。另請參閱:http://stackoverflow.com/questions/500504/javascript-for-in-with-arrays http://stackoverflow.com/questions/3010840/loop-through-array-in-javascript/ – CMS

+0

可能的重複[Javascript原型For ...在迭代器中?](http://stackoverflow.com/questions/7036097/javascript-prototype-for-in-iterators) –

回答

0

一些較新的瀏覽器support使所有這些額外屬性(系列,構造函數等)的方法不可枚舉,因此它們不出現在for-in循環中。

但是,如果您希望能夠支持舊瀏覽器,我認爲您運氣不佳:for-in是硬連接的語法,因此您無法對其進行修補。 (不管怎樣,魔術找到替換似乎已經奏效......)

+0

'object.hasOwnProperty(propertyString)'得到了很好的支持,並且可以用來避免'for .. in'循環中的問題。 –

0

Mootools的擴展Array.prototype,甚至Object.prototype,可與for .. in循環,其中列舉的所有屬性,即使是那些因爲他們似乎存在於物體干擾在原型鏈上向上。因此,測試如果屬性是使用它之前的對象的直接屬性:

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

OP已經做到了。他只是不喜歡修改代碼,因爲它來自另一個庫。 – hugomg

2

你提到你應該使用hasOwnProperty()。我不知道爲什麼你認爲這會導致更多的問題,確實有for(x in y)迴路我會傾向於默認使用hasOwnProperty(),只有忽略它的特殊情況。

話雖如此,我不會在陣列上使用for(x in y)循環。通常使用標準的for(i=0; i<y.length; i++)循環會更好,它當然會忽略所有的非數字屬性。 (除非你知道你有不連續的數組索引,在這種情況下for(x in y)將跳過未使用的索引,但即使在這種情況下,我可能仍然使用標準for並測試循環中undefined

更新:好吧,我現在明白了。如果您想繼續使用MooTools,那麼在解決方案中插入hasOwnProperty()是我能想到的最佳解決方案。應該合理安全只是for閉幕)後,將其插入:你不應該需要檢查現有{}括號或添加您自己的。