JavaScriptでClassもどきの継承したときに apply
を使ってたけど、three.js は call
を使っていてどう違うのか気になったので調べてみました。
MDN
Function.prototype.call
Function.prototype.apply
MDNによれば引数の形式が違うだけらしい。
callとapply
function extend (P, C) { C.prototype = Object.create(P.prototype); C.prototype.constructor = C; } |
【引数の数が同じ時はapplyが便利】
// Parent Class function Parent (x, y) { this.x = x; this.y = y; } // Child Class function Child (x, y) { Parent.apply(this, arguments); } // 継承 extend(Parent, Child); |
【引数の数が違う時はcallが便利】
// Parent Class function Box (x, y, z) { this.x = x; this.y = y; this.z = z; } // Child Class function Cube (x) { Box.call(this, x, x, x); } // 継承 extend(Box, Cube); |
便利って書いたけど、どっちでもそんなに変わらない。
好きな方を使ったら良いみたい。
MDNの解説を見ると、applyの第二引数は「引数として渡される値を格納した配列のようなオブジェクト、もしくは null か undefined」らしい。
配列のようなオブジェクト なので"arguments"
で構わないってことになるのかな。
ピンバック: [JavaScript]this参照を変更せずにsetTimeoutを実行したい « イナヅマTVログ