または、言い換えると、これを機能させる方法:
function foo(){}
//do something that modifies foo as if it was defined with "function foo(a,b,c){};"
console.log(foo.length);
//output: 3
または、言い換えると、これを機能させる方法:
function foo(){}
//do something that modifies foo as if it was defined with "function foo(a,b,c){};"
console.log(foo.length);
//output: 3
それは可能ですが、あまり良くないかもしれません:
function lengthDecorator(fun) {
function update(len) {
var args = []; // array of parameter names
for (var i = 0; i < len; ++i) {
args.push('a' + i);
}
var result = new Function('fun',
'return function(' + args.join(',') + ') {' +
'var args = Array.prototype.slice.call(arguments);' +
'return fun.apply(this, args);' + // call supplied function
'}'
); // create a function that will return a function
result = result(fun); // make the fun param known to the inner function
result.update = update;
return result;
}
return update(fun.length);
}
使用例:
var foo = lengthDecorator(function(a,b) {
return a+b;
});
print('foo.length: ' + foo.length);
print('foo(2, 3): ' + foo(2, 3));
print('');
foo = foo.update(42);
print('foo.length: ' + foo.length);
print('foo(2, 3): ' + foo(2, 3));
出力:
foo.length:2 foo(2、3):5 foo.length:42 foo(2、3):5
(ライブデモ:Ideone.com、jsFiddle)
lengthDecorator
提供された関数を、提供された関数と同じ量のパラメーターを受け取る関数でラップします。パラメータカウントは。で変更できますupdate
。
Cf
new Function(...)
:新しい関数を動的に作成します。fun.apply(...)
:"指定されたこの値と配列として提供された引数を使用して関数を呼び出します。"function foo() {}
alert(foo.length); // 0
foo = function (a, b, c) {}
alert(foo.length); // 3
実際に何をしようとしているのかわかりませんが、古いものfoo
をvarに保存してから、再定義することができますfoo
。
function foo() {...}
var oldfoo = foo;
foo = function (a, b, c) {
oldfoo();
}
しかし、ポイントは何ですか?
関数オブジェクトのlength
プロパティは書き込みも構成もできないため、その値を変更する方法はありません。
元の関数を内部的に呼び出す新しい関数を定義できます...