2011-12-29 11 views
2

__proto__はどこに配列に追加されますか?何の問題もなくこれを行うことができるために使用

for (data in dataArray) { // do some stuff }; 

は今、それは突然私のdataArrayに追加しました。この__proto__配列を反復処理されます。地獄はどこから来たの? MooToolsライブラリを使用していますか?それは私のすべてのループを壊している! :P今私が代わりにこれをしなければならない:私は取得しないでください

for (var i=0; i < dataArray.length; i++) { // do some stuff }; 

事は、この作業の理由... __proto__は実際には配列の要素としてカウントしないのですか?もしそうでなければ、なぜ最初のバージョンは以前と同じように動作しませんが、2番目のバージョンは動作しますか?

ライトをオンにするTIA ...

WR!

答えて

3

いいえ。 javascriptはプロトタイプです。そのプロトタイプを変更することで、何か(ネイティブなタイプのもの)を拡張できることを意味します。あなたは、後で作成する任意の配列を反復処理することを可能にする新しいメソッドを追加したい場合などには、あなたは何だろう:[].each(function(el) {});

Array.prototype.each = function(callback) { 
    // this == the array. code here... 
    return this; 
}; 

が、これは後に.eachをサポートしています作成した任意の配列を意味しています。はい、mootoolsは非常にプロトタイプのフレームワークです。ものごとはAMDになるmootoolsミルクで変わります。したがって、ネイティブを拡張することなく...

最終的には、javascriptではすべてがObjectネイティブからプロトタイプチェーンを継承します。

Arrayについては、実際には適切なArray Typeではありません.JavaScriptでは、配列のようなプロパティを持つObjectによく似ています。あなたが持っている問題を持っている理由を私にもたらします:

for (var foo in obj)実際にはループの方法Objectsではなく、Arraysです。私が言及したようにオブジェクトのようなものなので、配列でも動作します。

しかし、プロトタイプのフレームワークで作業する場合や、実行するすべてのコードやプロトタイプチェーンにどのような影響を与えているかわからない場合は、間違ったことです。他の言語で '連想配列'として知られているものを使用する場合は、単にObjectを使用してください。

mootoolsでは、Object.each(function(value, key) {});を使用して反復処理できます。

または:あなたのループチェックに表示する項目hasOwnProperty場合:

for (var data in dataArray) { 
    if (dataArray.hasOwnProperty(data)) { 
     // avoids working with prototype. 
    } 
} 
+0

輝かしいです。 :)明確で簡潔です。おかげで、完全な意味をつくって、私の問題を一掃してしまいました。 :) WR! – WhiteRau

+0

'for(var data' - データがスコープ内で宣言されていない場合、それは暗黙のグローバル変数になり、最後に反復されたプロパティの値になります。 –

関連する問題