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

JS繼承--原型鏈繼承和類式繼承

 更新時間:2013年04月08日 15:10:11   作者:  
本篇文章小編將為大家介紹JS繼承--原型鏈繼承和類式繼承,有需要的朋友可以參考一下

什么是繼承???答:別人白給你的過程就叫繼承。

為什么要用繼承呢?答:撿現(xiàn)成的唄。

好吧,既然大家都想撿現(xiàn)成的,那就要學(xué)會怎么繼承!

在了解之前,你需要先了解構(gòu)造函數(shù)、對象原型鏈等概念......

JS里常用的兩種繼承方式

    原型鏈繼承(對象間的繼承)類式繼承(構(gòu)造函數(shù)間的繼承)

原型鏈繼承

復(fù)制代碼 代碼如下:

//要繼承的對象
var parent={
name : "baba"
    say : function(){
alert("I am baba");
}
}

//新對象
var child = proInherit(parent);

//測試
alert(child.name); //"baba"
child.say(); //"I am baba"

利用proInherit(obj)方法,傳入對象,就能實現(xiàn)對象的屬性及方法的繼承,這個方法不是內(nèi)置方法,所以要自己定義,非常簡單:

復(fù)制代碼 代碼如下:

function proInherit(obj){
function F () {}
F.prototype = obj;
return new F();
}

其中F()為一個臨時的空的構(gòu)造函數(shù),然后將F()的原型設(shè)置為父對象,但是同時它又通過受益于_proto_鏈接而具有其父親對象的全部功能。

鏈?zhǔn)綀D解:

         

 

類式繼承

復(fù)制代碼 代碼如下:

//父類構(gòu)造函數(shù)
function Parent() {
this.name = "baba";
}
//父類原型方法
Parent.prototype.getName = function () {
return this.name;
}

//子類構(gòu)造函數(shù)
function Child() {
this.name = "cc";
}

//類式繼承
classInherit(Parent, Child);

//實例
var child = new Child();
alert(child.getName()) //“baba”

下面我們來看看這個繼承的關(guān)鍵方法:classInherit(Parent,Child)

復(fù)制代碼 代碼如下:

var classInherit = (function () {
var F = function () { }
return function (P, C) {
F.prototype = P.prototype;
C.prototype = new F();
C.prototype.constructor = C;
}
}());

 分析一下這個方法:

    首先創(chuàng)建一個空的構(gòu)造函數(shù)F(),用其實例的_proto_屬性來構(gòu)建父類與子類的原型鏈。起到一個代理的作用,目的是為了防止C.prototype = P.prototype,這樣會在子類實例化后修改屬性或方法時候,連同父類一起修改。整體采用即時函數(shù)并且在閉包中存儲F(),防止多次繼承時候創(chuàng)建大量的空的構(gòu)造函數(shù),從而減少消耗內(nèi)存。最后一行的意思是,由于原型鏈的關(guān)系,C的實例對象的constructor會指向P,所以重新設(shè)置。

鏈?zhǔn)綀D解:

            

這種方式雖然在實例的時候繼承了原型方法,但是父類的屬性無法繼承,下面介紹一種復(fù)制繼承,算是對類式繼承的補(bǔ)充。

復(fù)制繼承:

復(fù)制代碼 代碼如下:

//復(fù)制繼承
function copyInherit(p, c) {
var i,
toStr = Object.prototype.toString,
astr = "[object Array]";
c = c || {};
for (i in p) {
if (p.hasOwnProperty(i)) {
if (typeof p[i] === "object") {
c[i] = toStr.call(p[i]) == astr ? [] : {};
c[i] = copy(p[i], c[i]);
}
else {
c[i] = p[i];
}
}
}
return c;
}

//重寫Parent
function Parent() {
this.name = "pp";
this.obj= {a:1,b:2};
this.arr= [1, 2]
}
//實例
var child = new Child();
var parent = new Parent();
copyInherit(parent, child);
alert(child.name) //"baba"
alert(child.arr) //1,2
alert(child.obj.a) //1

 分析下copyInherit(p,c)

當(dāng)一個值賦予一個變量時候,分為傳值和傳引用兩種方式,當(dāng)你父對象內(nèi)屬性包含數(shù)組類型或是對象類型時候,  c[i] = toStr.call(p[i]) == astr ? [] : {};這一句會避免修改子對象屬性而引起的父對象屬性被篡改。

總結(jié):

類式繼承比較普遍,因為大家都比較熟悉這種構(gòu)造函數(shù)方式,但是內(nèi)存占用比較大。而原型式繼承,占用內(nèi)存比較小,但是包含數(shù)組,或者對象類型的克隆比較麻煩。復(fù)制繼承簡單,而且應(yīng)用廣泛。

 

相關(guān)文章

  • appendChild() 或 insertBefore()使用與區(qū)別介紹

    appendChild() 或 insertBefore()使用與區(qū)別介紹

    appendChild() 方法在節(jié)點(diǎn)的子節(jié)點(diǎn)列表末添加新的子節(jié)點(diǎn)。insertBefore() 方法在節(jié)點(diǎn)的子節(jié)點(diǎn)列表任意位置插入新的節(jié)點(diǎn),下面為大家介紹下具體的使用,感興趣的朋友不要錯過
    2013-10-10
  • javascript之Array 數(shù)組對象詳解

    javascript之Array 數(shù)組對象詳解

    本文主要是對javascript之Array 數(shù)組對象的詳解 ,比較詳細(xì),希望能給大家做一個參考。
    2016-06-06
  • javascript scrollLeft,scrollWidth,clientWidth,offsetWidth 完全詳解

    javascript scrollLeft,scrollWidth,clientWidth,offsetWidth 完全

    javascript scrollLeft,scrollWidth,clientWidth,offsetWidth 完全詳解,實例修正版。
    2009-07-07
  • js indexOf()定義和用法

    js indexOf()定義和用法

    js中indexOf() 方法可返回某個指定的字符串值在字符串中首次出現(xiàn)的位置
    2012-10-10
  • JavaScript基礎(chǔ)重點(diǎn)(必看)

    JavaScript基礎(chǔ)重點(diǎn)(必看)

    下面小編就為大家?guī)硪黄狫avaScript基礎(chǔ)重點(diǎn)(必看)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-07-07
  • javascript七大數(shù)據(jù)類型詳解

    javascript七大數(shù)據(jù)類型詳解

    這篇文章主要為大家介紹了 javascript七大數(shù)據(jù)類型,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-12-12
  • 簡介JavaScript中toTimeString()方法的使用

    簡介JavaScript中toTimeString()方法的使用

    這篇文章主要介紹了簡介JavaScript中toTimeString()方法的使用,是JS入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-06-06
  • JavaScript 學(xué)習(xí)初步 入門教程

    JavaScript 學(xué)習(xí)初步 入門教程

    看了《21天學(xué)習(xí)JavaScript》的視頻教程,感覺就是語法好熟悉,和C++類似,和C#類似,和Java類似!幡然悔悟這些語言的語法都是類似的,數(shù)據(jù)類型,對象方法(或者稱之為函數(shù),由于我是個菜鳥所以也數(shù)不清楚到底是什么)。
    2010-03-03
  • 淺談JavaScript面向?qū)ο?-繼承

    淺談JavaScript面向?qū)ο?-繼承

    這篇文章主要介紹了JavaScript面向?qū)ο罄^承,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • javascript的基礎(chǔ)交互詳解

    javascript的基礎(chǔ)交互詳解

    這篇文章主要介紹了javascript的基礎(chǔ)交互詳解,文章通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-10-10

最新評論

察雅县| 彰化市| 黎平县| 临桂县| 绥江县| 汤原县| 英德市| 巴林右旗| 襄樊市| 普定县| 英德市| 新民市| 平凉市| 庄浪县| 伊宁市| 奉贤区| 静海县| 宁都县| 宜都市| 黎川县| 济阳县| 江阴市| 和田市| 宁南县| 和龙市| 临猗县| 白沙| 金溪县| 武安市| 双辽市| 惠东县| 新田县| 高邮市| 克拉玛依市| 黎平县| 高安市| 屏山县| 宜兴市| 绍兴县| 合山市| 三亚市|