2016-12-16 2 views
0

のコードは以下の通りですjavascript関数:このプロトタイプ

function A() { 
 
    this.name = "kl"; 
 
    this.obj2 = { a: 1 }; 
 
} 
 

 
A.prototype.city = "china"; 
 
A.prototype.obj = {age: 30}; 
 

 
var a = new A(); 
 
var b = new A(); 
 

 
a.name = "kobe"; 
 
a.obj.age = 20; 
 
a.city = "American" 
 
a.obj2.a = 30; 
 

 
console.log(b.name); // k1 
 
console.log(b.city); // why china ? 
 
    
 
console.log(b.obj);  // when b.city = china, why b.obj = {age: 20} 
 
console.log(b.obj2); // {a: 1}

私の意見はあなたがすることはできませんあなたはこの[プロパティ]を編集する方法およびbは、この独自のを持っているということですので、独自のthis.valueを変更します。

プロパティは共有プロパティを宣言していますか?は正しい ? しかし、objが変更されたときにb.obj、 に変更するとb.cityに影響しませんか?

+1

あなたは価値観を共有するために、プロトタイプのメカニズムを使用したいと思うでしょうケースを印刷しますインスタンス間。それはあなたが見つけたような理解しにくい行動を引き起こす可能性があります。このプロトタイプは、インスタンス間で共有される**メソッド**のリポジトリと考える方が安全です。 –

答えて

4

両方のオブジェクトのプロトタイプチェーンにcityobjがあります。ただし、a.city = "American"の場合は、という新しいプロパティを作成します。cityaには、プロパティチェーン内のプロパティcityがシャドーイングされています。
プロパティに割り当てると(ほとんどの場合)、常にオブジェクト自体にそのプロパティが作成されます。

a.obj.age = 20;しかしa.objによって参照されるオブジェクト(!ない割り当て)を読み取り、そのageプロパティを更新します。 abは同じプロトタイプを持ち、したがってa.objとは同じオブジェクトに解決されます。オブジェクトが何らかの方法で変異している場合は、同じ方法でabに影響します。クロームコンソールから

構造:

enter image description here

+0

ああ、ありがとう、それははっきり言ってわかりにくいです! – kelen

1

のはラインでこのラインを通過してみましょう:すべての

  • まず、オブジェクトへA.prototypeポイント。
  • あなたはvar a = new A();
    1. を実行すると、あなたがこの新しいオブジェクトはkl{ a: 1 }
    2. は、このオブジェクトがリンクされた値を持つプロパティnameobj2「を有し、この」
    3. に設定されている新しいオブジェクトを作成しますオブジェクトA.prototypeがを指しているので、プロトタイプチェーンが設定されます。
    4. function Aの末尾にある関数は、実際にreturn this;を実行します。これは、実際にaに割り当てられるように作成されたオブジェクトを返します。
  • var b = new A();あなたがa.name = "kobe";を実行するときにa.city = "American";を実行したとき、あなたはklからkobe
  • に値を変更している、あなたはa自体に新しいプロパティcityを作成している
  • 上記と同様の処理を行い
  • a.obj2.a = 30;を実行すると、値の変更も行われます。
  • しかし、あなたはa.obj.age = 20;を実行すると、何かが
    • aは自身のプロパティobjを持っていない異なるので、それはA.prototypeポイントにオブジェクトにプロトタイプチェーンを上昇し、プロパティobjを見つけたので、これをコードの行は、実際にobjこと変更、およびbはVAと性質nameを有しているので、あなたが、b.nameの実行時20
  • から30からobj.ageの値を変化させますLUE kl、それがオブジェクトにプロトタイプチェーンまでA.prototypeポイントを行くと、それはそれがないものを、見つけることができれば、以前のように、見るのでしかし、bは、自身のプロパティcityを持っていない、それはkl
  • を出力しますので、 A.prototype.city = "china";を実行したので、chinaが印刷されます。 console.log(b.obj);が実行される
  • は、bはプロトタイプチェーンに上がると、オブジェクト上にA.prototypeポイントをobjを見つけ、それはそれはめったにいない{age: 20}
+0

ありがとう、あなたの答えはすごいです! – kelen