2016-12-04 10 views
0

私はこれを理解するのに苦労します。 javscriptのスニペットはオブジェクト内のオブジェクトを使用したJavascriptプロトタイプ継承

TEST=function(){}; 
    TEST.prototype={ 
     b:{ 
      b1:"", 
      b2:{} 
     } 
    }; 

    //Instance 1 
    var first=new TEST(); 
    first.b.b1="TEXT"; 

    //Instance 2 
    var second=new TEST(); 

    console.log("Result",second.b.b1); 

"TEXT"と出力します。だから私はなぜこの結果を得るのだろうと思っています。なぜ新しいインスタンスを作成して値を設定するときに、それが "TEST"プロトタイプ(主な問題です)を変更するのですか?

私はBergiとMykola(ありがとう)と複写の助けを得ました。しかし、私はまだこの振る舞いによってリソースを失ったと思って、それがなぜこのように構築されているのだろうと思っていますか?インスタンスで作業するときにプロトタイプを更新する必要はありません。

答えて

1

プロトタイプのメソッドとプロパティaddは、すべてのインスタンスを継承します。したがって、プロトタイプオブジェクトの値を変更する場合は、すべてのインスタンスに対してこの値を変更します。

これを修正するためです。コンストラクタで値を設定する必要があるため、インスタンスごとに異なる値を初期化します。

これは、あなたが望むものを出力します。

TEST=function(){ 
    this.b ={ 
     b1:"", 
     b2:{} 
    } 
}; 
TEST.prototype.forAll = "im global"; 
//Instance 1 
var first=new TEST(); 
first.b.b1="TEXT"; 

//Instance 2 
var second=new TEST(); 

console.log("Second",second.b.b1, second.forAll); 
console.log("First",first.b.b1, first.forAll); 

希望します。

+0

ありがとう、私は私のコンストラクタを再構築します。しかし、なぜfirst.b.b1と最初の.__ proto __。b.b1とwindow.TEST.prototype.b.b1が同じであるのかという論理を理解できませんか? – Oddis

+1

@Oddisオブジェクトが1つしかないので、 'TEST.prototype.b'と' first.b'と 'second.b'はすべてそれを指しています – Bergi

+0

BergiとMykolaのおかげで、私はそれを受け入れます。しかし、私はこの動作によってリソースを失ったと思う。再度、感謝します。 – Oddis

関連する問題