4

クロージャーの考え方は理解できたと思いますが、次のコードは驚くべき動作をします。

function A(x)
{
  this.getX1 = function () { return x; }
  A.prototype.getX2 = function () { return x; }
}
var a1 = new A(1);
var a2 = new A(2);
console.log ('a1.getX1()=%d', a1.getX1 ()); // 1
console.log ('a2.getX1()=%d', a2.getX1 ()); // 2
console.log ('a1.getX2()=%d', a1.getX2 ()); // 2 ???
console.log ('a2.getX2()=%d', a2.getX2 ()); // 2

プロトタイプ メソッドがインスタンス メソッドと異なる動作をするかどうかは理解できましたが、これは x が静的変数になっているように見えます。呼び出しの順序を変更しても、結果は変わりません。

4

4 に答える 4

4

を変更すると、既存のインスタンスを含む、指定されたクラスのすべてのprototypeインスタンスのが変更functionされます。

したがって、あなたが電話するとき...

A.prototype.getX2 = function () { return x; }

の既存のa1インスタンスに設定していますA。したがって、事実上、次の擬似コードになります。

<all instances of A>.getX2 = function () {
    return <latest value of x passed to A constructor>;
}
于 2012-10-08T08:58:46.297 に答える
2

ここでの静的メンバーはA.prototype.getX2. A.prototype.getX2 = function () { return x; }( による)への 2 番目の呼び出しvar a2 = new A(2);は、最初の呼び出しを置き換えます。それを理解するために、インスタンス化の順序を逆にすることができます:

var a2 = new A(2);
var a1 = new A(1);

次に、次のようになります。

a1.getX1()=1
a2.getX1()=2
a1.getX2()=1
a2.getX2()=1
于 2012-10-08T08:55:28.607 に答える
2

新しい A を作成するたびに、getX2 を 2 回定義しています。その関数の結果は常に最後の X になります。コードを次のように書き直すことを検討してください。

function A(x) {

    this.x = x;
    this.getX1 = function() {
        return this.x;
    }
}
A.prototype.getX2 = function() {
    return this.x;
}
var a1 = new A(1);
var a2 = new A(2);
console.log('a1.getX1()=%d', a1.getX1()); // 1
console.log('a2.getX1()=%d', a2.getX1()); // 2
console.log('a1.getX2()=%d', a1.getX2()); // 1
console.log('a2.getX2()=%d', a2.getX2()); // 2​​​ 

このように、getX2 を 1 回定義するだけで、期待どおりに機能します。

于 2012-10-08T09:02:24.147 に答える
1

あなたが書いた

function A(x)
{
  this.getX1 = function () { return x; }
  A.prototype.getX2 = function () { return x; }
}

このコンストラクタA.prototype.getX2は毎回上書きします。

だから最初に

var a1 = new A(1); // This invokes A and adds a function `getX2` to the prototype of `A`which returns `x` that is `1`

var a2 = new A(2); // This invokes A and overwrites the function `getX2` in the prototype of `A` with a function which returns `x` that is `2` now.

だから、このようにする必要があります

function A(x)
{
  this.getX1 = function () { return x; }
}

A.prototype.getX2 = function () { return this.getX1(); }
于 2012-10-08T09:00:26.517 に答える