国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 語(yǔ)言 > JavaScript > 正文

Javascript無(wú)參數(shù)和有參數(shù)類繼承問題解決方法

2024-05-06 16:15:42
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
這篇文章主要介紹了Javascript無(wú)參數(shù)和有參數(shù)類繼承問題解決方法,本文講解了無(wú)參數(shù)類繼承的問題和有參類繼承的問題,并給出了解決方案,需要的朋友可以參考下
 

說(shuō)到Javascript的類繼承,就必然離不開原型鏈,但只通過原型鏈實(shí)現(xiàn)的繼承有著不少缺陷。

無(wú)參數(shù)類繼承的問題

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


這段代碼的主要問題是:

 

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:

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


可以看到,這段代碼中根本沒有辦法把s1和s2傳到A,而又因?yàn)閷?shí)例化A作為B的原型時(shí)沒有參數(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)的問題就是如何把A的方法添加到B的原型中去。這也不難,只要遍歷A.prototype,把方法復(fù)制到B.prototype即可。要注意的是,對(duì)于同名的方法,自然是子類優(yōu)先(重載),因而不能覆蓋:
復(fù)制代碼代碼如下:

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

后記

 

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


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 邵阳市| 冕宁县| 拉萨市| 杭州市| 富顺县| 望都县| 柯坪县| 哈密市| 赤城县| 广灵县| 隆子县| 黔西| 伽师县| 霍邱县| 莲花县| 永修县| 深州市| 拜城县| 旬邑县| 县级市| 鄂尔多斯市| 乐亭县| 石棉县| 大英县| 永寿县| 钟山县| 正安县| 土默特右旗| 延边| 九龙县| 工布江达县| 五原县| 广州市| 拜城县| 齐齐哈尔市| 公主岭市| 新巴尔虎左旗| 桓台县| 馆陶县| 台州市| 临邑县|