更にJavascriptのクラスの継承について議論します.

1806 ワード

パラメータの継承がない問題
例のコードを先に見て、BがAに継承されることを実現します.
 
  
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.com nstructorはBではなくAです.
参クラス継承の問題があります.
AとBは2つの文字列パラメータs 1とs 2があると仮定し、Aでは2つの文字列の総長を計算し、Bは直接s 1、s 2をパラメータとして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");
このコードの中でs 1とs 2をAに伝えることができませんでした.また、インスタンスAはBのプロトタイプとしてパラメータがないため、異常が発生しました.
 
  
s1 is undefined
ソリューション
s 1とs 2の作用領域はB内だけで、それらをAに伝えるにはB中でしか操作できません.関数のアプリ方法で実現できます.
 
  
function B(s1, s2) {
  A.apply(this, arguments);
  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の拡張子としても書かれ、遅く発表される.