オブジェクトを無理やり配列化できるんだね

今日はRoppongi.jsjQuery読み合わせ会をやりました。進行の仕方が決まってなくて、結構グダグダで進んでいきましたが、得るものがいくつかありました。その中でも一番興味深かったのがJavaScriptのダックタイピング的性質でした。

var hoge = {}
hoge[0] = 'aaa';
hoge[1] = 'bbb';
Array.prototype.push.apply(hoge, ['ccc']);
alert(hoge[2]);

このように書くと未定義なんだけど・・・

var hoge = {}
hoge[0] = 'aaa';
hoge[1] = 'bbb';
hoge.length = 2;
Array.prototype.push.apply(hoge, ['ccc']);
alert(hoge[2]);

このようにlengthプロパティをオブジェクトに持たせると、意図したとおりに3番目の要素に'ccc'が格納されるのですよ!!しかもlengthも3にちゃんと変更されるんです!

これは外見が似ていればそのように振舞うっていうダックタイピングの考え方と同じですよね。でもオブジェクト自体はArrayを継承して作っているわけではないのでメソッドはもってないんです。このようにメソッドだけ借りてくることができるみたいですよ。

ちょっと興奮したのでエントリー