2

によってサイズ 1 が返されるのはなぜmy_game.size()ですか? make_gamefrom の引数が挿入されるgameので3 になると思っていましたarguments.lengthが、どうやらそうではないようです。これの理由は何ですか?

function game()
{
    var args = arguments;
    this.size = function() { return args.length; };
}

function make_game()
{
    return new game(arguments);
}

var my_game = make_game(4, 'a', true);

console.log(my_game.size()); // 1
4

5 に答える 5

6

argumentsオブジェクト全体を単一の引数として渡しています

その中の各引数を個別の引数として渡したい場合は、明示的に行う必要があります。

return new game(arguments[0], arguments[1], arguments[2]);

コンストラクター関数を使用していない場合は、apply メソッドを使用できます。

return game.apply(this, arguments); 

…しかし、あなたはこの結果を得るでしょう:

Uncaught TypeError: function apply() { [native code] } is not a constructor 

apply…の代わりにコンストラクタとして使用しようとするためgame

于 2013-05-29T19:24:16.310 に答える
4

game(arguments)内部で行う場合、単一の引数でmake_game()呼び出しています。これは、に渡された引数の配列です。game()make_game()

各引数を個別に渡したい場合は、通常は を使用しますがgame.apply(arguments)、これを適切に機能さnewせるには、もう少し複雑になります。

function make_game()
{
    return new (Function.prototype.bind.apply(game, arguments));
}

この回答には、この方法がどのように機能するかについての詳細な説明があります。

于 2013-05-29T19:29:54.997 に答える
3
return new game(arguments);

引数オブジェクトを 1 つだけ渡しています。だから、それは1つの議論です。

引数を通常の関数に転送するには、apply を使用します。

var fn = function() {
  otherFn.apply(null, arguments);
};

しかし、これは 2 つのことを行います。引数として使用する引数配列を渡しますが、実行コンテキスト (の値this) も設定します。しかし、コンストラクター関数は this の独自の値を作成します。これには問題があります...


コンストラクターへの引数の転送は、単純な JS では非常に複雑です。Coffee スクリプトでは簡単ですが、クレイジーな JS にコンパイルされます。 こちらをご覧ください

トリックは、no-op コンストラクターで新しいサブクラスを作成し、コンストラクターを手動で呼び出すことのようです。

var newConstructor = function() {}; // no-op constructor
newConstructor.prototype = Game.prototype; // inherit from Game
var child = new newConstructor(); // instantiate no-op constructor
var result = Game.apply(child, arguments); // invoke real constructor.

しかし、それはかなり毛むくじゃらです。おそらく、アプローチを再考する必要があります。

于 2013-05-29T19:25:06.480 に答える
1

コンストラクターに引数を 1 つだけ渡しますarguments

変化する

var args = arguments;

var args = arguments[0];
于 2013-05-29T19:23:46.053 に答える