funcWrapper の引数オブジェクトが[function sum(num1, num2){ return num1 + num2; }, 2, 3]
であるためです。最初の引数は渡す関数です。arguments
オブジェクトは、関数に渡すすべての引数です。
解決策は、オブジェクトである最初の引数を除外することです。通常、javascript では、配列のスライス メソッドを使用します。これarguments
はオブジェクトであり、そのメソッドはありません。ただし、次の回避策を実行できます。
var args = Array.prototype.slice.call(arguments, 1);
return func.apply(this, args);
funcWrapper で。最初の行を次のように変換して短くします。
var args = [].slice.call(arguments, 1);
return func.apply(this, args);
次のような関数にラップすることもできます。
function _slice(obj, start, end) {
return [].slice.call(obj, start, end);
}
そして、次のように使用します。
var args = _slice(arguments, 1);
ES6 (ブラウザーには実装されていません) では、この問題は残りのパラメーターを使用することで解決されることに注意してください。
function funcWrapper(func, ...args){
return func.apply(this, args);
};
もう1つ、コンストラクターをラップしようとしているときは、プロトタイプも継承していることを確認してください。そうしないと、この質問と同じトラップに陥ります: jQuery logger plugin