1

または、言い換えると、これを機能させる方法:

function foo(){}
//do something that modifies foo as if it was defined with "function foo(a,b,c){};"
console.log(foo.length); 
//output: 3
4

4 に答える 4

2

それは可能ですが、あまり良くないかもしれません:

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.comjsFiddle

lengthDecorator提供された関数を、提供された関数と同じ量のパラメーターを受け取る関数でラップします。パラメータカウントは。で変更できますupdate

Cf

  • new Function(...):新しい関数を動的に作成します。
  • fun.apply(...):"指定されたこの値と配列として提供された引数を使用して関数を呼び出します。"
于 2012-06-12T01:12:05.800 に答える
1
function foo() {}
alert(foo.length); // 0

foo = function (a, b, c) {}
alert(foo.length); // 3
于 2012-06-12T00:08:13.200 に答える
0

実際に何をしようとしているのかわかりませんが、古いものfooをvarに保存してから、再定義することができますfoo

function foo() {...}

var oldfoo = foo;
foo = function (a, b, c) {
    oldfoo();
}

しかし、ポイントは何ですか?

于 2012-06-11T23:54:46.423 に答える
-1

関数オブジェクトのlengthプロパティは書き込みも構成もできないため、その値を変更する方法はありません。

元の関数を内部的に呼び出す新しい関数を定義できます...

于 2012-06-12T00:03:28.593 に答える