Webtech Walker

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なオブジェクトとかについては以下のエントリーが参考になります。

このエントリーをはてなブックマークに追加