說(shuō)到Javascript的類繼承,就必然離不開原型鏈,但只通過原型鏈實(shí)現(xiàn)的繼承有著不少缺陷。
無(wú)參數(shù)類繼承的問題
先看一段示例代碼,實(shí)現(xiàn)B繼承于A:
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.需要實(shí)例化A作為B的原型,此時(shí)就執(zhí)行了A的構(gòu)造函數(shù)。但按照面向?qū)ο蟮囊?guī)則,實(shí)例化B之前,B及其父類A的構(gòu)造函數(shù)都不應(yīng)該執(zhí)行。
2.更改了B的prototype,導(dǎo)致b.constructor不是B而是A。
有參類繼承的問題
假設(shè)A和B都有兩個(gè)字符串參數(shù)s1和s2,A中計(jì)算了兩段字符串的總長(zhǎng)度,B直接以s1、s2為參數(shù)調(diào)用A:
function B(s1, s2) {
}
B.prototype = new A();
B.prototype.b1 = function() {
};
new B("ab", "123");
s1和s2的作用域只在B內(nèi),要把它們傳到A,就只能在B中操作,借助函數(shù)的apply方法就可以實(shí)現(xiàn)之:
考慮到C#、Java等高級(jí)語(yǔ)言都拋棄了多繼承,因此,本文所討論的也只是單繼承的情況。而本文所述的繼承方法,也會(huì)寫成jRaiser的一個(gè)擴(kuò)展,遲些發(fā)布。
|
新聞熱點(diǎn)
疑難解答
圖片精選