欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2015年03月02日 10:57:39   投稿:junjie  
這篇文章主要介紹了Javascript無參數(shù)和有參數(shù)類繼承問題解決方法,本文講解了無參數(shù)類繼承的問題和有參類繼承的問題,并給出了解決方案,需要的朋友可以參考下

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

無參數(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);
}

接下來的問題就是如何把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í)語言都拋棄了多繼承,因此,本文所討論的也只是單繼承的情況。而本文所述的繼承方法,也會(huì)寫成jRaiser的一個(gè)擴(kuò)展,遲些發(fā)布。

相關(guān)文章

  • 分享一個(gè)原生的JavaScript拖動(dòng)方法

    分享一個(gè)原生的JavaScript拖動(dòng)方法

    本文給大家分享的是基于JavaScript的setCapture方法實(shí)現(xiàn)的拖動(dòng)效果,非常的簡(jiǎn)單實(shí)用,有需要的小伙伴可以參考下
    2016-09-09
  • js實(shí)現(xiàn)鼠標(biāo)移入移出卡片切換內(nèi)容

    js實(shí)現(xiàn)鼠標(biāo)移入移出卡片切換內(nèi)容

    這篇文章主要為大家詳細(xì)介紹了js實(shí)現(xiàn)鼠標(biāo)移入移出卡片切換內(nèi)容,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • asp錯(cuò)誤 '80040e21' 多步 OLE DB 操作產(chǎn)生錯(cuò)誤

    asp錯(cuò)誤 '80040e21' 多步 OLE DB&nbs

    今天在寫asp入庫操作的時(shí)候提示Microsoft OLE DB Provider for ODBC Drivers 錯(cuò)誤 80040e21 多步 OLE DB 操作產(chǎn)生錯(cuò)誤,請(qǐng)檢查每個(gè) OLE DB 狀態(tài)值,經(jīng)測(cè)試時(shí)函數(shù)定義文件沒有加載導(dǎo)致類型不對(duì),所以無法入庫
    2023-05-05
  • JavaScript實(shí)現(xiàn)table切換的插件封裝

    JavaScript實(shí)現(xiàn)table切換的插件封裝

    這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)table切換的插件封裝,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • 詳解JavaScript中Promise類的使用方法

    詳解JavaScript中Promise類的使用方法

    這篇文章主要為大家詳細(xì)介紹了JavaScript中Promise類的使用方法,文中的示例代碼簡(jiǎn)潔易懂,對(duì)我們學(xué)習(xí)JavaScript有一定的幫助,需要的可以參考一下
    2023-05-05
  • 不錯(cuò)的JS中變量相關(guān)的細(xì)節(jié)分析

    不錯(cuò)的JS中變量相關(guān)的細(xì)節(jié)分析

    不錯(cuò)的JS中變量相關(guān)的細(xì)節(jié)分析...
    2007-08-08
  • Javascript實(shí)現(xiàn)代碼折疊功能

    Javascript實(shí)現(xiàn)代碼折疊功能

    代碼折疊起來,使整段程序縮成一行,看起來清爽了許多。大家在使用Visual Studio環(huán)境進(jìn)行開發(fā)時(shí),可以把某個(gè)類或某個(gè)函數(shù)折疊起來,在很多網(wǎng)頁上也有類似的功能,那到底是如何實(shí)現(xiàn)的呢?其實(shí)很簡(jiǎn)單,只要通過JavaScript就可以實(shí)現(xiàn)。
    2016-08-08
  • style、 currentStyle、 runtimeStyle區(qū)別分析

    style、 currentStyle、 runtimeStyle區(qū)別分析

    style、 currentStyle、 runtimeStyle區(qū)別分析,需要的朋友可以參考下。
    2010-08-08
  • js中的this的指向問題詳解

    js中的this的指向問題詳解

    這篇文章主要介紹了js中的this的指向問題以及相關(guān)知識(shí)點(diǎn)內(nèi)容,需要的朋友們參考學(xué)習(xí)下。
    2019-08-08
  • js正則格式化日期時(shí)間自動(dòng)補(bǔ)0的兩種解法

    js正則格式化日期時(shí)間自動(dòng)補(bǔ)0的兩種解法

    在javascript開發(fā)中,我們會(huì)遇到日期時(shí)間格式化的問題,下面這篇文章主要給大家介紹了關(guān)于js正則格式化日期時(shí)間自動(dòng)補(bǔ)0的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2021-10-10

最新評(píng)論