萬盛學電腦網

 萬盛學電腦網 >> 腳本專題 >> javascript >> Javascript無參數和有參數類繼承問題解決方法

Javascript無參數和有參數類繼承問題解決方法

 這篇文章主要介紹了Javascript無參數和有參數類繼承問題解決方法,本文講解了無參數類繼承的問題和有參類繼承的問題,並給出了解決方案,需要的朋友可以參考下

   

說到Javascript的類繼承,就必然離不開原型鏈,但只通過原型鏈實現的繼承有著不少缺陷。

無參數類繼承的問題

先看一段示例代碼,實現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


這段代碼的主要問題是:

 

1.需要實例化A作為B的原型,此時就執行了A的構造函數。但按照面向對象的規則,實例化B之前,B及其父類A的構造函數都不應該執行。

2.更改了B的prototype,導致b.constructor不是B而是A。

有參類繼承的問題

假設A和B都有兩個字符串參數s1和s2,A中計算了兩段字符串的總長度,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 is undefined
解決方案

 

s1和s2的作用域只在B內,要把它們傳到A,就只能在B中操作,借助函數的apply方法就可以實現之:

代碼如下:
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的一個擴展,遲些發布。

copyright © 萬盛學電腦網 all rights reserved