Arrayに追加された関数は1つの要素
Yahoo!Japan WEB APIコンテストに出そうかと思って Widget を作っています。
Widgetの動作は JavaScript で書くのですが、やっていて気づいたこと。
Array(配列)に関数を追加すると、その関数は1つの要素のようになります。
たとえば、以下のように関数を追加し、
Array.prototype.indexOf = function(e){ var index; for(i = 0; i < this.length; i++){ if(e == this[i]) index = i; } return index != null ? index : -1; }
そのあと、以下のコードを実行。
var list = new Array(1, 2, 3, 4, 5); for(key in list){ print(key); }
すると、次の実行結果が得られます。
0 1 2 3 4 indexOf
ちなみに、上の配列listが存在するところで以下のコードを実行すると、
for(key in list){ print(list[key]); }
以下のように関数の中身がそのまま表示されます。
1 2 3 4 5 function (e) { var index; for (i = 0; i < this.length; i++) { if (e == this[i]) { index = i; } } return index != null ? index : -1; }
ちなみに、length は関数を除外しているらしく、この場合は5を返します。
これでしばらくハマった・・・。
JavaScriptは後からメソッドを追加できるのが便利だけど、こういう副作用があるので注意しないと・・・。