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は後からメソッドを追加できるのが便利だけど、こういう副作用があるので注意しないと・・・。