あなたがしたとき
C.prototype = new B();
「プロトタイプが必要なときはいつでも」とは言いませんでしたnew B
。あなたが言ったことは、「プロトタイプをに割り当てることですnew B()
(これはそれほど驚くべきことではありません)。得られるものは次のとおりです。
C.prototype.b.a === 0
あなたがするときはいつでもnew C
、あなたは複製していませんC.prototype
-あなたはそれを同じB
オブジェクトにリンクしているだけです:
C.prototype = new B()
^ ^
| |
c1 c2
c1.b === c2.b; //true
ご存知かもしれませんが、オブジェクトは思いのままに変更できます。したがって、 を実行c1.b.a = 4
すると、基礎となるオブジェクトにアクセスして、それをいじることになります。
編集:最初の例は、プロパティの解決がどのように機能するかによって機能します。プロパティが オブジェクトまたはにb
存在しません。「give me」と言うと、js エンジンは次のように処理します。c1
c2
c1.b
b
にプロパティはありますc1
か? いいえ、ありません。
- のプロトタイプを見てみましょう
c1
(実際のプロトタイプ、オブジェクトがメソッドとプロパティを取得したもの - この場合はC.prototype
)
- ああ、それは
b
プロパティを持っています。返してください。
実際の js では、これ ( spec ) は次のとおりです。
function GetProperty (name, obj) {
while (obj !== null) {
if (obj.hasOwnProperty(name)) {
return obj[name];
}
obj = Object.getPrototypeOf(obj);
}
return undefined;
}
つまり、それb
がオブジェクトの場合、オブジェクトを保持しています。これを変更すると、通常のオブジェクトのように変更されます (c1.b
直接割り当てているわけではないことに注意してください。私の言いたいことが少しわかります)。矢印で説明:
C.prototype.b = 0
^ ^
| |
c1.b c2.b
これは重要なので、もう一度強調します。 をつかむと、c1.b
他のオブジェクトと同じように操作されるオブジェクトが得られます。それにプロパティを割り当てることは、他の通常のオブジェクトと同じです。
さて、前者のケース ( c1.b = 10
) では、実際にプロパティを割り当てています。c1
これは、オブジェクト自体でキーと値のペアを作成していることを意味します。したがって、最初のステップでc1
は、 にプロパティがあるかどうかを確認しb
ます。より多くの矢印で説明:
C.prototype.b = 0
^
|
c1.b=10 c2.b
後者の例を変更すると、同じ効果が観察できます。
//changing
c1.b.a = 10;
//to
c1.b = 4;
c2.b !== 4 && c2.b.a === 0; //true
要点をまとめると:
c1
前の例では、オブジェクトにプロパティを設定するだけです。
- 後者の例では、
c1
s プロトタイプのオブジェクトにプロパティを設定し、他のすべてのC
オブジェクトでそれを変更しました。