ホームページ > ウェブフロントエンド > jsチュートリアル > JavaScriptチュートリアル:不完全継承(JSプロトタイプチェーン)_基礎知識

JavaScriptチュートリアル:不完全継承(JSプロトタイプチェーン)_基礎知識

WBOY
リリース: 2016-05-16 17:03:59
オリジナル
1344 人が閲覧しました

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内の「メンバ変数」をオブジェクトとしてアクセスすると、「メンバ変数」自体は変更されませんが、そのメンバを変更する際に「メンバ変数」オブジェクトが変更されます。 「メンバー変数」オブジェクトを変更すると、変更された「メンバー変数」オブジェクトのメンバーはすべてのオブジェクト インスタンスで共有されることになり、クラス設計の本来の意図に反します。
例:

コードをコピー コードは次のとおりです。

'package'.j(function () {
'class A'.j(function () {
jpublic({
v:{a: 1}
});
jprivate({
p:{a :1}
);
});

'クラス B は A' を拡張'.j(function () {

});

});

var b1 = new B();

b1.v.a = 5;
b1.x.a = 5;

var b2 = new B();


console.log(b1.v.a) // 出力は 5
console.log(b1.x.a) // 出力は 5

console.log(b2.v.a) // 出力も 5 ですが、予想される 1

console.log(b2.x.a) // 出力は 1
console.log(b2.p.a) ) // 利用できない場合は、p が存在しないことを示すプロンプトが表示されます



この問題を解決するにはどうすればよいですか?
A. v のようなメンバー「メンバー変数」(それ自体がオブジェクト) はプロトタイプ チェーン上では定義されていませんが、この時点でオブジェクト インスタンスが作成されると、それはオブジェクトの中に存在します。 __proto__ で配布されています。

Js も同様のメソッドを提供しています。jprivate で定義された「メンバー変数」または「メンバー関数」がオブジェクトの __proto__ に代入され、このインスタンスのみが利用可能である限り、jprotected で定義された「メンバー変数」が使用可能です。 ( (それ自体がオブジェクトです) オブジェクトの __proto__ にも割り当てられ、それを継承するもののみが使用可能です。


B. プロトタイプチェーンでは読み取り専用の「メンバー変数」(それ自体がオブジェクト) のみが定義されます

C.jpublic によって定義される「メンバー変数」のメンバー (それ自体がオブジェクトです) は読み取り専用メンバーのみです。値を割り当てないでください。そうしないと、値がさまざまなインスタンス間で共有されます。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート