さまざまな目的で、関数をオブジェクトにラップする必要があることがよくあります。length
ラッパー関数で元の関数のプロパティを保持するエレガントな方法はありますか?
例えば:
var x = {
a: function(arg1, arg2) { /* do something */ }
};
function wrap(obj) {
var original = obj.a;
obj.a = function wrapper() {
console.log('a called');
original.apply(this, arguments);
};
}
x.a.length; // => 2
wrap(x);
x.a.length; // => 0
私がしたいこと:
var x = {
a: function(arg1, arg2) { /* do something */ }
};
function wrap(obj) {
var original = obj.a;
obj.a = function wrapper() {
console.log('a called');
original.apply(this, arguments);
};
obj.a.length = original.length;
}
x.a.length; // => 2
wrap(x);
x.a.length; // => 2 (actual still 0)
ただし、書き込み可能ではないため、これは機能しませんlength
。
現時点で思いつく唯一の解決策は、(1) 関数を文字列として動的に生成するか、eval
またはnew Function
(2) 異なる長さのプロキシ関数の巨大な配列を持ち、正しい長さに対応するプロキシ関数を選択することです. これは私には洗練された解決策とは思えません。また、関数内の各引数を指定length
せずに任意の関数を作成できるようにすることは、合理的な要求のようです。
bind
これを内部的に行うことができるようです:
function a(b, c) { }
a.bind(null).length; // => 2
これにより、元の長さのラッパー関数が作成されます! それはまさに私が自分でできるようになりたいことです。
他に方法はありますか?