JavaScriptのクラス継承といえば、プロトタイプチェーンを分離できないことは避けられませんが、プロトタイプチェーンを介した継承にのみ多くの欠点があります。
パラメーターなしの継承の問題
まず、AからB継承を実装するためのサンプルコードを見てみましょう。
コードコピーは次のとおりです。
関数a(){
}
a.prototype.a1 = function(){};
関数b(){
}
b.prototype = new a();
b.prototype.b1 = function(){};
var b = new b();
アラート(b.constructor == a); // 真実
アラート(b.constructor == b); // 間違い
このコードの主な問題は次のとおりです。
1. AはBのプロトタイプとしてインスタンス化する必要があり、Aのコンストラクターは現時点で実行されます。ただし、オブジェクト指向のルールによれば、Bとその親クラスAは、Bをインスタンス化する前に実行されるべきではありません。
2。Bのプロトタイプを変更し、B.ConstructorではなくAを変更しました。
高麗人参クラスの継承には問題があります
AとBに2つの文字列パラメーターS1とS2があるとします。 Aは2つの文字列の全長を計算し、BはS1とS2をパラメーターとして直接Aを呼び出します。
コードコピーは次のとおりです。
関数a(s1、s2){
this.totallength = s1.length + s2.length;
}
a.prototype.a1 = function(){
};
関数B(S1、S2){
}
b.prototype = new a();
b.prototype.b1 = function(){
};
新しいb( "ab"、 "123");
ご覧のとおり、このコードではS1とS2をAに渡す方法はありません。BのプロトタイプとしてAをインスタンス化するときにパラメーターがないため、例外が発生します。
コードコピーは次のとおりです。
S1は未定義です
解決
S1とS2の範囲はBにのみBにあります。それらをAに渡すには、Bでのみ動作できます。関数の適用方法を使用して実現できます。
コードコピーは次のとおりです。
関数B(S1、S2){
A.適用(これ、引数);
アラート(this.totallength);
}
次の質問は、プロトタイプBにメソッドAを追加する方法です。これは難しくありません。プロトタイプを実行して、メソッドをb.prototypeにコピーします。同じ名前のメソッドの場合、サブクラスは自然に好まれる(過負荷)に注意する必要があります。
コードコピーは次のとおりです。
for(a.prototypeのvar m){
if(!b.prototype [m]){//親クラスの方法はサブクラスをオーバーライドできません
b.prototype [M] = A.Prototype [M];
}
}
ポストスクリプト
C#やJavaなどの高レベルの言語が多発性相続を放棄したことを考慮すると、この記事では単一の相続の状況について説明します。この記事で説明されている継承方法は、Jraiserの延長としても記述され、後でリリースされます。