JavaScript の継承は、標準的な oop の継承とは大きく異なります。JavaScript の継承では、プロトタイプ チェーン テクノロジーが使用されます。J はすべて、スーパークラス、つまり C.prototype に「メンバー変数」を配置します。 superclass = C.superclass = P.prototype;
var c = new C(), c.__proto__ = C.prototype;
c が「メンバー変数」にアクセスする際、__proto__ が取得できない場合は検索しますC.prototype に存在しない場合は、オブジェクトの作成時に __proto__ のみが割り当てられ (各オブジェクトが独立して割り当てられます)、その他は定義時に割り当てられます (各オブジェクトで共有されます)。このとき、C.prototype内の「メンバ変数」をオブジェクトとしてアクセスすると、「メンバ変数」自体は変更されませんが、そのメンバを変更する際に「メンバ変数」オブジェクトが変更されます。 「メンバー変数」オブジェクトを変更すると、変更された「メンバー変数」オブジェクトのメンバーはすべてのオブジェクト インスタンスで共有されることになり、クラス設計の本来の意図に反します。
例:
});
});var b1 = new B();
b1.v.a = 5;
b1.x.a = 5;
console.log(b1.v.a) // 出力は 5
console.log(b1.x.a) // 出力は 5
console.log(b2.x.a) // 出力は 1
console.log(b2.p.a) ) // 利用できない場合は、p が存在しないことを示すプロンプトが表示されます
この問題を解決するにはどうすればよいですか?
A. v のようなメンバー「メンバー変数」(それ自体がオブジェクト) はプロトタイプ チェーン上では定義されていませんが、この時点でオブジェクト インスタンスが作成されると、それはオブジェクトの中に存在します。 __proto__ で配布されています。
B. プロトタイプチェーンでは読み取り専用の「メンバー変数」(それ自体がオブジェクト) のみが定義されます
C.jpublic によって定義される「メンバー変数」のメンバー (それ自体がオブジェクトです) は読み取り専用メンバーのみです。値を割り当てないでください。そうしないと、値がさまざまなインスタンス間で共有されます。