2016-04-18 10 views
-1

現在、私はこの次の例のようJSクラスを宣言しています:クラスの異なるインスタンスを作成します

:今私のクラスは、この例のように見える、

function X(a) { 
    this.x = a; 
    X.prototype.do = function() { 
     console.log(x); 
    } 
} 

が、私は「この」キーワードを削除したいです

function X(a) { 
    var x = a; 
    X.prototype.do = function() { 
     console.log(x); 
    } 
} 

これは、Xクラスのインスタンスが1つの場合に効果的です。私は複数のインスタンスを作成しようとすると、私は次の問題を参照してください。

var x1 = new X(1); 
x1.do(); // prints 1 
var x2 = new X(2); 
x2.do(); // prints 2 
x1.do(); // prints 2 instead of 1 

という問題は、同じクラスの複数のインスタンスを作成するから私を防ぎます。 誰でもこの問題が発生する理由と回避方法を知っていますか?

+0

最初の例では、 'x'は宣言されていません。そして、コンストラクタ内のプロトタイプを決して変更しないでください。 – Oriol

答えて

5

あなたは、クラスのすべてのインスタンスのためにそれを再定義していることを意味する方法、のprototype実装を再定義しています。また、このメソッドは閉じた値を返しますので、クラスのすべてのインスタンスで同じ値を返します。

function X(a) { 
    this.x = a; 
} 

X.prototype.do = function() { 
    console.log(this.x); 
} 

か::

function X(a) { 
    this.do = function() { 
     console.log(a); 
    }; 
} 

ない両方の奇妙なミックス

はどちらかと書きます。

+0

素晴らしい!第二の選択肢は、私が探していたものです。私は8分で答えを受け入れるでしょう:) – Matansh

+0

これはコンストラクタ内の各オブジェクトのメソッドを再定義するのが一般的ではないことに注意してください。あなたは*最初の方法を使用すべきです。あなたがなぜ「this」を取り除きたいのか分かりません。 – deceze

+0

私はこのクラスの変数をprivateにする必要があります。メソッドを再定義せずにそれを作る方法はありますか? – Matansh

関連する問題