想要繼承夯尽,就必須要提供個父類(繼承誰扒磁,提供繼承的屬性)
一袱箱、原型鏈繼承
重點(diǎn):讓新實(shí)例的原型等于父類的實(shí)例遏乔。
特點(diǎn):1、實(shí)例可繼承的屬性有:實(shí)例的構(gòu)造函數(shù)的屬性发笔,父類構(gòu)造函數(shù)屬性盟萨,父類原型的屬性。(新實(shí)例不會繼承父類實(shí)例的屬性?疬帧)
缺點(diǎn):1鸯旁、新實(shí)例無法向父類構(gòu)造函數(shù)傳參噪矛。
2量蕊、繼承單一。
3艇挨、所有新實(shí)例都會共享父類實(shí)例的屬性残炮。(原型上的屬性是共享的,一個實(shí)例修改了原型屬性缩滨,另一個實(shí)例的原型屬性也會被修改J凭汀)
二、借用構(gòu)造函數(shù)繼承
重點(diǎn):用.call()和.apply()將父類構(gòu)造函數(shù)引入子類函數(shù)(在子類函數(shù)中做了父類函數(shù)的自執(zhí)行(復(fù)制))
特點(diǎn):1脉漏、只繼承了父類構(gòu)造函數(shù)的屬性苞冯,沒有繼承父類原型的屬性。
2侧巨、解決了原型鏈繼承缺點(diǎn)1舅锄、2、3司忱。
3皇忿、可以繼承多個構(gòu)造函數(shù)屬性(call多個)。
4坦仍、在子實(shí)例中可向父實(shí)例傳參鳍烁。
缺點(diǎn):1、只能繼承父類構(gòu)造函數(shù)的屬性繁扎。
2幔荒、無法實(shí)現(xiàn)構(gòu)造函數(shù)的復(fù)用。(每次用每次都要重新調(diào)用)
3、每個新實(shí)例都有父類構(gòu)造函數(shù)的副本铺峭,臃腫墓怀。
三、組合繼承(組合原型鏈繼承和借用構(gòu)造函數(shù)繼承)(常用)
重點(diǎn):結(jié)合了兩種模式的優(yōu)點(diǎn)卫键,傳參和復(fù)用
特點(diǎn):1傀履、可以繼承父類原型上的屬性,可以傳參莉炉,可復(fù)用钓账。
2、每個新實(shí)例引入的構(gòu)造函數(shù)屬性是私有的絮宁。
缺點(diǎn):調(diào)用了兩次父類構(gòu)造函數(shù)(耗內(nèi)存)梆暮,子類的構(gòu)造函數(shù)會代替原型上的那個父類構(gòu)造函數(shù)。
四绍昂、原型式繼承
重點(diǎn):用一個函數(shù)包裝一個對象啦粹,然后返回這個函數(shù)的調(diào)用,這個函數(shù)就變成了個可以隨意增添屬性的實(shí)例或?qū)ο缶接巍bject.create()就是這個原理唠椭。
特點(diǎn):類似于復(fù)制一個對象,用函數(shù)來包裝忍饰。
缺點(diǎn):1贪嫂、所有實(shí)例都會繼承原型上的屬性。
2艾蓝、無法實(shí)現(xiàn)復(fù)用力崇。(新實(shí)例屬性都是后面添加的)
五、寄生式繼承
重點(diǎn):就是給原型式繼承外面套了個殼子赢织。
優(yōu)點(diǎn):沒有創(chuàng)建自定義類型亮靴,因?yàn)橹皇翘琢藗€殼子返回對象(這個),這個函數(shù)順理成章就成了創(chuàng)建的新對象于置。
缺點(diǎn):沒用到原型茧吊,無法復(fù)用。
六俱两、寄生組合式繼承(常用)
寄生:在函數(shù)內(nèi)返回對象然后調(diào)用
組合:1饱狂、函數(shù)的原型等于另一個實(shí)例。2宪彩、在函數(shù)中用apply或者call引入另一個構(gòu)造函數(shù)休讳,可傳參
重點(diǎn):修復(fù)了組合繼承的問題
繼承這些知識點(diǎn)與其說是對象的繼承,更像是函數(shù)的功能用法尿孔,如何用函數(shù)做到復(fù)用俊柔,組合筹麸,這些和使用繼承的思考是一樣的。上述幾個繼承的方法都可以手動修復(fù)他們的缺點(diǎn)雏婶,但就是多了這個手動修復(fù)就變成了另一種繼承模式物赶。
這些繼承模式的學(xué)習(xí)重點(diǎn)是學(xué)它們的思想,不然你會在coding書本上的例子的時候留晚,會覺得明明可以直接繼承為什么還要搞這么麻煩酵紫。就像原型式繼承它用函數(shù)復(fù)制了內(nèi)部對象的一個副本,這樣不僅可以繼承內(nèi)部對象的屬性错维,還能把函數(shù)(對象奖地,來源內(nèi)部對象的返回)隨意調(diào)用,給它們添加屬性赋焕,改個參數(shù)就可以改變原型對象参歹,而這些新增的屬性也不會相互影響。