18 06 2011 javascript Tweet
JGPを読んでいたら、配列リテラルはオブジェクトリテラルを使って書けると書いてあった。
var nums = ['one', 'two', 'three'];
これは
var obj_nums = {'0':'zero', '1':'one', '2':'two'};
ただし配列リテラルの方はArray.prototypeを継承するが、オブジェクトリテラルの場合にはObject.prototypeを継承する。
そこで継承関係をいじれば配列として使えるのかなぁと試してみた(Firebug)。
まずそのままだと
var obj_nums = {'0':'zero', '1':'one', '2':'two'}; console.log(obj_nums.toString()); // [object Object] var nums = ['zero','one','two']; console.log(nums.toString()); // zero,one,two
となる。続いて継承をいじってみる
var obj_nums = {'0':'zero', '1':'one', '2':'two'}; obj_nums.__proto__ = Array.prototype; console.log(obj_nums.toString()); // (an empty string)
empty stringってなんやねんと思ったがlengthプロパティを付けてみる。
var obj_nums = {'0':'zero', '1':'one', '2':'two'}; obj_nums.__proto__ = Array.prototype; obj_nums.length = 3; console.log(obj_nums.toString()); // zero,one,two
Arrayリテラルと同じ挙動を示すようになった。内部でなにやってんだろうか?
ただし、オブジェクトを出力するとobj_numsのほうがプロパティが見えるんだよなぁ。これがちょっと気になる。
var obj_nums = {'0':'zero', '1':'one', '2':'two'}; obj_nums.__proto__ = Array.prototype; obj_nums.length = 3; console.log(obj_nums); var nums = ['zero','one','two']; console.log(nums);
というわけで、来週の読書会は配列のあたりをやりますので興味があれば参加すると楽しいと思います。ちなみに杉山フルーツの生ゼリーをおやつに迎える予定にしておりますよ。
もちろん、お昼につけナポを食べるのもありだと思います。