パラメータなしのクラス継承の問題
まず、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 をパラメータとして呼び出します:
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 と s2 のスコープは B にのみあります。それらを A に転送するには、B でのみ操作できます。これは、apply の助けを借りて達成できます。関数のメソッド:
コードをコピー
}
次の質問は、A のメソッドを追加する方法です。 Bのプロトタイプに。これは難しいことではありません。A.prototype をトラバースしてメソッドを B.prototype にコピーするだけです。同じ名前のメソッドの場合、サブクラスが優先される (オーバーロード) ため、オーバーライドできないことに注意してください:
コードをコピー
}
}
追記
高級言語を考えるC# や Java などは多重継承を放棄しているため、この記事では単一継承の場合についてのみ説明します。この記事で説明する継承メソッドも jRaiser の拡張として作成され、後日リリースされる予定です。