1

プロトタイプオブジェクトで定義されたメソッドを呼び出すために、コンストラクター内でメソッドを適用する必要があるのはなぜですか?

コード作業:

    function Test(){
    this.x = [];
    this.add.apply(this,arguments);
    }

    Test.prototype.add = function(){
    for(var i=0; i < arguments.length; i++){
    this.x.push(arguments[i]);
    }
    }

    var t = new Test(11,12)

    t.x          //[11,12]  this is fine
    t.x.length   //2 this is also fine

しかし、コンストラクター内で add を直接呼び出すと

コードが機能しない:

    function Test(){
    this.x = [];
    this.add(arguments);
    }

    Test.prototype.add = function(){
    for(var i=0; i < arguments.length; i++){
    this.x.push(arguments[i]);
    }
    }

    var t = new Test(11,12);
    t.x.length; //1 Not added all elements why?

ここに画像の説明を入力

4

1 に答える 1

5

これはプロトタイプとは何の関係もありませんapply。配列を取り、その値を関数の引数として使用して呼び出す方法と関係があります。この場合、

this.add(arguments);

それはまさにそれをやっています。最初の引数が配列のようなオブジェクトである add を呼び出すと、最初の要素が配列である x が配列になります。new Test(1, 2, 3)結果はx = [ [1, 2, 3] ]次のようになります (内部配列は実際には Arguments オブジェクトですが、配列に似ています)。ただし、そうする場合

this.add.apply(this, arguments);

それは本質的にやっている

this.add(arguments[0], arguments[1], arguments[2], ...);

そして、このように x は、配列内の配列ではなく、これらの要素の配列になります。つまり、間に余分な配列がなくても、が得られnew Test(1, 2, 3)ます。x = [1, 2, 3]

于 2012-12-31T12:34:45.780 に答える