3
function Resource(){ 
    var id = '';

    this.getId = function(){
        return id;
    }

    this.setId = function(value){
        id = value;
    }
}

function Model(){ } 
Model.prototype = new Resource();

上記のコードをテストするために、私は次のものを持っています:

var m1 = new Model();
m1.setId("blah");
alert("m1 = " + m1.getId());

var m2 = new Model();
m2.setId("blahblah");
alert("m2 = " + m2.getId());

alert("m1 = " + m1.getId());

次の警告が表示されると思いますm1 = blah, m2 = blahblah, m1 = blah

ただし、以下が表示されていますm1 = blah, m2 = blahblah, m1 = blahblah

上記のコードは、JavaScriptでの継承を理解し始めるための実験として作成しました。おそらく、何が表示されるべきかについての私の期待は、私のJava / C#のバックグラウンドによるものです。明らかに、作成された新しいModelオブジェクトはそれぞれid、Resourceで定義された同じ変数を共有します。どうしてこれなの?

これをどのように記述すれば、新しい各モデルが独自のid(明らかなもの以外の-モデル内での定義)を持つことができますか?

ところで、私はプライベート変数の動作を探しているので、意図的にidvar idではなくidを定義しました。this.id

4

2 に答える 2

3

プロトタイプオブジェクトは、すべてのインスタンス間で共有されます。

変数はコンストラクターにid属し、ofはの単一インスタンスであるため、すべてのインスタンスがその単一インスタンスを使用しているため、同じ変数を使用しています。ResourceprototypeModelResourceModel

インスタンスごとModelに独自の変数を設定するには、コンストラクターとアクセサーメソッドで変数idを作成する必要があります。idModel

function Model() {
    var id = '';

    this.getId = function(){
        return id;
    }

    this.setId = function(value){
        id = value;
    }
}

これを実現する別の方法は、インスタンスをコンテキストとしてResource使用して呼び出すことです。Modelこれは、次を使用して.call、または.apply次のように実行されます。

function Model() {
    Resource.apply(this);
}

これにより関数が呼び出され、変数とそのアクセサーメソッドResourceが作成されますが、アクセサーはインスタンスに割り当てられます。idModel

于 2012-10-01T15:41:57.680 に答える
0

これは単なるスコープの問題です。get /setメソッドthis.idだけでなく、話していることを指定しました。これはうまく機能しました。id

this.getId = function(){
  return this.id;
}

this.setId = function(value){
  this.id = value;
}

これがフィドルです:http://jsfiddle.net/thewebguy/zHDwC/

于 2012-10-01T15:42:18.913 に答える