最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

再論Javascript的類(lèi)繼承

 更新時(shí)間:2011年03月05日 14:20:56   作者:  
說(shuō)到Javascript的類(lèi)繼承,就必然離不開(kāi)原型鏈,但只通過(guò)原型鏈實(shí)現(xiàn)的繼承有著不少缺陷。
無(wú)參數(shù)類(lèi)繼承的問(wèn)題

先看一段示例代碼,實(shí)現(xiàn)B繼承于A:
復(fù)制代碼 代碼如下:

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

這段代碼的主要問(wèn)題是:

* 需要實(shí)例化A作為B的原型,此時(shí)就執(zhí)行了A的構(gòu)造函數(shù)。但按照面向?qū)ο蟮囊?guī)則,實(shí)例化B之前,B及其父類(lèi)A的構(gòu)造函數(shù)都不應(yīng)該執(zhí)行。
* 更改了B的prototype,導(dǎo)致b.constructor不是B而是A。

有參類(lèi)繼承的問(wèn)題

假設(shè)A和B都有兩個(gè)字符串參數(shù)s1和s2,A中計(jì)算了兩段字符串的總長(zhǎng)度,B直接以s1、s2為參數(shù)調(diào)用A:
復(fù)制代碼 代碼如下:

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");

可以看到,這段代碼中根本沒(méi)有辦法把s1和s2傳到A,而又因?yàn)閷?shí)例化A作為B的原型時(shí)沒(méi)有參數(shù),所以出現(xiàn)了異常:
復(fù)制代碼 代碼如下:

s1 is undefined

解決方案

s1和s2的作用域只在B內(nèi),要把它們傳到A,就只能在B中操作,借助函數(shù)的apply方法就可以實(shí)現(xiàn)之:
復(fù)制代碼 代碼如下:

function B(s1, s2) {
  A.apply(this, arguments);
  alert(this.totalLength);
}

接下來(lái)的問(wèn)題就是如何把A的方法添加到B的原型中去。這也不難,只要遍歷A.prototype,把方法復(fù)制到B.prototype即可。要注意的是,對(duì)于同名的方法,自然是子類(lèi)優(yōu)先(重載),因而不能覆蓋:
復(fù)制代碼 代碼如下:

for (var m in A.prototype) {
  if (!B.prototype[m]) { // 父類(lèi)不能覆蓋子類(lèi)的方法
    B.prototype[m] = A.prototype[m];
  }
}

后記

考慮到C#、Java等高級(jí)語(yǔ)言都拋棄了多繼承,因此,本文所討論的也只是單繼承的情況。而本文所述的繼承方法,也會(huì)寫(xiě)成jRaiser的一個(gè)擴(kuò)展,遲些發(fā)布。

相關(guān)文章

最新評(píng)論

东乌| 调兵山市| 海林市| 三门县| 和硕县| 平遥县| 金寨县| 桐柏县| 石棉县| 吉木萨尔县| 奎屯市| 乌兰浩特市| 越西县| 长汀县| 大渡口区| 青龙| 富蕴县| 阿瓦提县| 西城区| 和顺县| 泽库县| 石家庄市| 根河市| 曲阳县| 静宁县| 恩平市| 陆河县| 合江县| 长岛县| 克东县| 辽宁省| 孟连| 五峰| 泌阳县| 离岛区| 天津市| 大足县| 昌黎县| 南昌市| 南溪县| 三都|