ホームページ  >  記事  >  ウェブフロントエンド  >  Javascript クラスの継承_JavaScript スキルに関する別のディスカッション

Javascript クラスの継承_JavaScript スキルに関する別のディスカッション

WBOY
WBOYオリジナル
2016-05-16 18:09:471183ブラウズ

パラメータなしのクラス継承の問題

まず、A から B の継承を実装するサンプル コードを見てください:

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

function A() {
}
A.prototype.a1 = function() {

function B() {
}
B.prototype = new A();
B.prototype.b1 = function() {
} var b = new B( );
alert(b.constructor == A); // true
alert(b.constructor == B); // false


このコードの主な問題は次のとおりです。 :
* A は B のプロトタイプとしてインスタンス化される必要があります。このとき、A のコンストラクターが実行されます。しかし、オブジェクト指向の規則によれば、B をインスタンス化する前に、B とその親クラス A のコンストラクターを実行すべきではありません。
* B のプロトタイプを変更し、b.constructor が B ではなく A になりました。

パラメータ クラスの継承に問題があります

A と B の両方に 2 つの文字列パラメータ s1 と s2 があり、A は 2 つの文字列の合計の長さを計算し、B は s1 を直接使用するとします。 s2 は A をパラメータとして呼び出します:



コードをコピー コードは次のとおりです: function A( s1, s2 ) {
this.totalLength = s1.length s2.length;
}
A.prototype.a1 = function() {

function B( s1, s2 ) {
}
B.prototype = new A();
B.prototype.b1 = function() {

new B("ab ", " 123");


ご覧のとおり、このコードでは s1 と s2 を A に渡す方法がなく、A を B のプロトタイプとしてインスタンス化するときにパラメーターがないためです。 、例外が発生します:



コードをコピーします
コードは次のとおりです: s1 は未定義です。
解決策

s1 と s2 のスコープは B にのみあります。それらを A に転送するには、B でのみ操作できます。これは、apply の助けを借りて達成できます。関数のメソッド:



コードをコピー
コードは次のとおりです: function B(s1 , s2) { A.apply(this, argument); alert(this.totalLength)
}


次の質問は、A のメソッドを追加する方法です。 Bのプロトタイプに。これは難しいことではありません。A.prototype をトラバースしてメソッドを B.prototype にコピーするだけです。同じ名前のメソッドの場合、サブクラスが優先される (オーバーロード) ため、オーバーライドできないことに注意してください:



コードをコピー
コードは次のとおりです: for (var m in A.prototype) { if (!B.prototype[m]) { // 親クラスは のメソッドをオーバーライドできません。サブクラス B .prototype[m] = A.prototype[m];
}
}


追記

高級言語を考えるC# や Java などは多重継承を放棄しているため、この記事では単一継承の場合についてのみ説明します。この記事で説明する継承メソッドも jRaiser の拡張として作成され、後日リリースされる予定です。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。