javascriptでArray.prototype.push.applyとかを使う理由
jQueryのソースとで下記のような表記を見かけます。(1.4からは push = Array.prototype.push というエイリアスつくってますけど)
Array.prototype.push.apply( this, elems );
これはArray likeなオブジェクトを作るときに用いる手法なんですけど、そこら変はとりあえず置いておいて、なんでこれが
this.push( elems );
じゃダメなのかがわからなかったんですけど、検証してみたらすぐわかりました。
var obj = {};
obj.push('foo'); // => [error] obj.push is not a function
上記がエラーになるのに対して以下は成功します。
var obj = {};
Array.prototype.push.apply( obj, ['foo'] ); // obj => { 0: "foo", length: 1 }
objはObjectなのでArrayのメソッドであるpushをobjに対して実行しようとするとエラーになります。なのでobjにpushメソッドを適用するにはArrayのpushメソッドを借りてきて実行するわけです。なんか黒魔術っぽくて気持ち悪い。
Array likeなオブジェクトとかについては以下のエントリーが参考になります。
- anything from here jQueryに学ぶ Javascript の基礎(6) func.apply(obj , array) upon Ver1.3.2──jQuery解読(39)
- anything from here jQueryに学ぶ Javascript の基礎(7) 組み込みクラス Array の各種メソッドに apply() メソッドを適用する──jQuery解読(40)
- Prev Entry:gitで削除したファイルをまとめてインデックスに記録する
- Next Entry:sub { my $arg = shift; } のshift