国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

JavaScript繼承方式詳解

Yangyang / 923人閱讀

摘要:可以通過構(gòu)造函數(shù)和原型的方式模擬實現(xiàn)類的功能。原型式繼承與類式繼承類式繼承是在子類型構(gòu)造函數(shù)的內(nèi)部調(diào)用超類型的構(gòu)造函數(shù)。寄生式繼承這種繼承方式是把原型式工廠模式結(jié)合起來,目的是為了封裝創(chuàng)建的過程。

js繼承的概念

js里常用的如下兩種繼承方式:

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

由于js不像java那樣是真正面向?qū)ο蟮恼Z言,js是基于對象的,它沒有類的概念。所以,要想實現(xiàn)繼承,可以用js的原型prototype機制或者用applycall方法去實現(xiàn)

在面向?qū)ο蟮恼Z言中,我們使用來創(chuàng)建一個自定義對象。然而js中所有事物都是對象,那么用什么辦法來創(chuàng)建自定義對象呢?這就需要用到js的原型:

我們可以簡單的把prototype看做是一個模版,新創(chuàng)建的自定義對象都是這個模版(prototype)的一個拷貝 (實際上不是拷貝而是鏈接,只不過這種鏈接是不可見,新實例化的對象內(nèi)部有一個看不見的__Proto__指針,指向原型對象)。

js可以通過構(gòu)造函數(shù)和原型的方式模擬實現(xiàn)類的功能。 另外,js類式繼承的實現(xiàn)也是依靠原型鏈來實現(xiàn)的。

原型式繼承與類式繼承

類式繼承是在子類型構(gòu)造函數(shù)的內(nèi)部調(diào)用超類型的構(gòu)造函數(shù)。
嚴格的類式繼承并不是很常見,一般都是組合著用:

function Super(){
    this.colors=["red","blue"];
}
 
function Sub(){
    Super.call(this);
}

原型式繼承是借助已有的對象創(chuàng)建新的對象,將子類的原型指向父類,就相當于加入了父類這條原型鏈

原型鏈繼承

為了讓子類繼承父類的屬性(也包括方法),首先需要定義一個構(gòu)造函數(shù)。然后,將父類的新實例賦值給構(gòu)造函數(shù)的原型。代碼如下:

以上原型鏈繼承還缺少一環(huán),那就是Object,所有的構(gòu)造函數(shù)都繼承自Object。而繼承Object是自動完成的,并不需要我們自己手動繼承,那么他們的從屬關(guān)系是怎樣的呢?

確定原型和實例的關(guān)系

可以通過兩種方式來確定原型和實例之間的關(guān)系。操作符instanceofisPrototypeof()方法:

alert(brother instanceof Object)//true
alert(test instanceof Brother);//false,test 是brother的超類
alert(brother instanceof Child);//true
alert(brother instanceof Parent);//true

只要是原型鏈中出現(xiàn)過的原型,都可以說是該原型鏈派生的實例的原型,因此,isPrototypeof()方法也會返回true

js中,被繼承的函數(shù)稱為超類型(父類,基類也行),繼承的函數(shù)稱為子類型(子類,派生類)。使用原型繼承主要由兩個問題:
一是字面量重寫原型會中斷關(guān)系,使用引用類型的原型,并且子類型還無法給超類型傳遞參數(shù)。

偽類解決引用共享和超類型無法傳參的問題,我們可以采用“借用構(gòu)造函數(shù)”技術(shù)

借用構(gòu)造函數(shù)(類式繼承)

借用構(gòu)造函數(shù)雖然解決了剛才兩種問題,但沒有原型,則復(fù)用無從談起,所以我們需要原型鏈+借用構(gòu)造函數(shù)的模式,這種模式稱為組合繼承

組合繼承

組合式繼承是比較常用的一種繼承方法,其背后的思路是 使用原型鏈實現(xiàn)對原型屬性和方法的繼承,而通過借用構(gòu)造函數(shù)來實現(xiàn)對實例屬性的繼承。這樣,既通過在原型上定義方法實現(xiàn)了函數(shù)復(fù)用,又保證每個實例都有它自己的屬性。

call()的用法:調(diào)用一個對象的一個方法,以另一個對象替換當前對象。

call([thisObj[,arg1[, arg2[, [,.argN]]]]]) 
原型式繼承

這種繼承借助原型并基于已有的對象創(chuàng)建新對象,同時還不用創(chuàng)建自定義類型的方式稱為原型式繼承

原型式繼承首先在obj()函數(shù)內(nèi)部創(chuàng)建一個臨時性的構(gòu)造函數(shù) ,然后將傳入的對象作為這個構(gòu)造函數(shù)的原型,最后返回這個臨時類型的一個新實例。

寄生式繼承

這種繼承方式是把原型式+工廠模式結(jié)合起來,目的是為了封裝創(chuàng)建的過程。

組合式繼承的小問題

組合式繼承是js最常用的繼承模式,但組合繼承的超類型在使用過程中會被調(diào)用兩次;一次是創(chuàng)建子類型的時候,另一次是在子類型構(gòu)造函數(shù)的內(nèi)部

以上代碼是之前的組合繼承,那么寄生組合繼承,解決了兩次調(diào)用的問題。

寄生組合式繼承

call和apply

全局函數(shù)applycall可以用來改變函數(shù)中this的指向,如下:

 // 定義一個全局函數(shù)
    function foo() {
        console.log(this.fruit);
    }
    
    // 定義一個全局變量
    var fruit = "apple";
    // 自定義一個對象
    var pack = {
        fruit: "orange"
    };
    
    // 等價于window.foo();
    foo.apply(window);  // "apple",此時this等于window
    // 此時foo中的this === pack
    foo.apply(pack);    // "orange"
    



文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/85454.html

相關(guān)文章

  • JavaScript 繼承方式詳解

    摘要:原型繼承與類繼承類繼承是在子類型構(gòu)造函數(shù)的內(nèi)部調(diào)用父類型的構(gòu)造函數(shù)原型式繼承是借助已有的對象創(chuàng)建新的對象,將子類的原型指向父類。 JavaScript 繼承方式的概念 js 中實現(xiàn)繼承有兩種常用方式: 原型鏈繼承(對象間的繼承) 類式繼承(構(gòu)造函數(shù)間的繼承) JavaScript不是真正的面向?qū)ο蟮恼Z言,想實現(xiàn)繼承可以用JS的原型prototype機制或者call和apply方法 在面...

    YuboonaZhang 評論0 收藏0
  • JavaScript深入淺出

    摘要:理解的函數(shù)基礎(chǔ)要搞好深入淺出原型使用原型模型,雖然這經(jīng)常被當作缺點提及,但是只要善于運用,其實基于原型的繼承模型比傳統(tǒng)的類繼承還要強大。中文指南基本操作指南二繼續(xù)熟悉的幾對方法,包括,,。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。 怎樣使用 this 因為本人屬于偽前端,因此文中只看懂了 8 成左右,希望能夠給大家?guī)韼椭?...(據(jù)說是阿里的前端妹子寫的) this 的值到底...

    blair 評論0 收藏0
  • javaScript原型及原型鏈詳解(二)

    摘要:當然這還沒完,因為我們還有重要的一步?jīng)]完成,沒錯就是上面的第行代碼,如果沒有這行代碼實例中的指針是指向構(gòu)造函數(shù)的,這樣顯然是不對的,因為正常情況下應(yīng)該指向它的構(gòu)造函數(shù),因此我們需要手動更改使重新指向?qū)ο蟆? 第一節(jié)內(nèi)容:javaScript原型及原型鏈詳解(二) 第一節(jié)中我們介紹了javascript中的原型和原型鏈,這一節(jié)我們來講利用原型和原型鏈我們可以做些什么。 普通對象的繼承 ...

    widuu 評論0 收藏0
  • javascript對象詳解:__proto__和prototype的區(qū)別和聯(lián)系

    摘要:當這步完成,這個對象就與構(gòu)造函數(shù)再無聯(lián)系,這個時候即使構(gòu)造函數(shù)再加任何成員,都不再影響已經(jīng)實例化的對象了。此時,對象具有了和屬性,同時具有了構(gòu)造函數(shù)的原型對象的所有成員,當然,此時該原型對象是沒有成員的。 前言 本篇文章用來記錄下最近研究對象的一些心得,做一個記錄與總結(jié),以加深自己的印象,同時,希望也能給正在學習中的你一點啟發(fā)。本文適合有一定JavaScript基礎(chǔ)的童鞋閱讀。原文戳這...

    chavesgu 評論0 收藏0
  • 前端文檔收集

    摘要:系列種優(yōu)化頁面加載速度的方法隨筆分類中個最重要的技術(shù)點常用整理網(wǎng)頁性能管理詳解離線緩存簡介系列編寫高性能有趣的原生數(shù)組函數(shù)數(shù)據(jù)訪問性能優(yōu)化方案實現(xiàn)的大排序算法一怪對象常用方法函數(shù)收集數(shù)組的操作面向?qū)ο蠛驮屠^承中關(guān)鍵詞的優(yōu)雅解釋淺談系列 H5系列 10種優(yōu)化頁面加載速度的方法 隨筆分類 - HTML5 HTML5中40個最重要的技術(shù)點 常用meta整理 網(wǎng)頁性能管理詳解 HTML5 ...

    jsbintask 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<