イナヅマTVログ

[JavaScript] Function.prototype.callとFunction.prototype.applyとか

| 1件のコメント

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"で構わないってことになるのかな。

1件のコメント

  1. ピンバック: [JavaScript]this参照を変更せずにsetTimeoutを実行したい « イナヅマTVログ

コメントを残す

必須欄は * がついています


このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください