js繼承的實(shí)現(xiàn)方式
先理解一下prototype和__proto__;
????????我們創(chuàng)建的每一個(gè)函數(shù)都有一個(gè)prototype屬性(原型),這個(gè)屬性是一個(gè)對(duì)象,它的用途是包含可以由特定類型的所有實(shí)例共享的屬性和方法。(這個(gè)對(duì)象下面有個(gè)屬性,設(shè)個(gè)屬性是另一個(gè)對(duì)象的應(yīng)用,這個(gè)屬性就是一個(gè)對(duì)象。)
????????function是對(duì)象,function的原型prototype也是對(duì)象,它們都會(huì)具有對(duì)象共有的特點(diǎn)。即:對(duì)象具有屬性__proto__,每個(gè)對(duì)象都會(huì)在其內(nèi)部初始化一個(gè)屬性,就是__proto__,當(dāng)我們?cè)L問一個(gè)對(duì)象的屬性時(shí),如果這個(gè)對(duì)象的內(nèi)部不存在這個(gè)屬性,那么它就會(huì)去__proto__里找這個(gè)屬性,這個(gè)__proto__又會(huì)有自己的__proto__,于是就這樣一直找下去,也就是我們平時(shí)所說的原型鏈概念。__proto__可稱之為隱式原型,一個(gè)對(duì)象的隱式原型指向構(gòu)造該對(duì)象的構(gòu)造函數(shù)的原型,這也保證了實(shí)例能夠訪問在構(gòu)造函數(shù)原型中定義的屬性和方法。
????????function這個(gè)特殊的對(duì)象,除了和其它對(duì)象一樣有上述__proto__屬性之外,還有自己特有的屬性————原型屬性(prototype),這個(gè)屬性是一個(gè)指針,指向一個(gè)對(duì)象,這個(gè)對(duì)象的用途就是包含所有實(shí)例共享的屬性和方法(我們把這個(gè)屬性叫做原型對(duì)象)。prototype是通過調(diào)用構(gòu)造函數(shù)而創(chuàng)建的那個(gè)實(shí)例的原型對(duì)象。使用原型對(duì)象的好處是可以讓所有對(duì)象實(shí)例共享他所包含的屬性和方法,不必在構(gòu)造函數(shù)中定義對(duì)象實(shí)例的信息,而是可以將這些信息直接添加到原型對(duì)象中。原型對(duì)象也有一個(gè)屬性,叫做constructor,這個(gè)屬性包含了一個(gè)指針,指回原構(gòu)造函數(shù)。
? ? ? ? prototype和__proto__聯(lián)系
? prototype和__proto__都指向原型對(duì)象,任意一個(gè)函數(shù)(包括構(gòu)造函數(shù))都有一個(gè)prototype屬性,指向該函數(shù)的原型對(duì)象,同樣任意一個(gè)構(gòu)造函數(shù)實(shí)例化的對(duì)象,都有一個(gè)__proto__屬性(__proto__并非標(biāo)準(zhǔn)屬性,ECMA-262第5版將該屬性或指針稱為[[Prototype]],可通過Object.getPrototypeOf()標(biāo)準(zhǔn)方法訪問該屬性)指向構(gòu)造函數(shù)的原型對(duì)象。
實(shí)例的__proto__與構(gòu)造函數(shù)的prototype相同。
Function的__proto__指向函數(shù)本身。
Function的prototype指向函數(shù)本身。
Object的__proto__指向原型對(duì)象。
prototype和__proto__區(qū)別

先定義一個(gè)父類。

1.原型鏈繼承。
核心:將父類的實(shí)例作為子類的原型。

特點(diǎn):
? ? ? ? 1.非常純粹的繼承關(guān)系,實(shí)例是子類的實(shí)例,也是父類的實(shí)例
? ? ? ? 2.父類新增原型方法/原型屬性,子類都能訪問到。
? ? ? ? 3.簡(jiǎn)單,易于實(shí)現(xiàn)。
缺點(diǎn):
? ? ? ? 1.想要為子類新增屬性和方法,必須要在new Animal()這樣的語句之后執(zhí)行,不能放到構(gòu)造器中。
? ? ? ? 2.無法實(shí)現(xiàn)多繼承。
? ? ? ? 3.來自原型對(duì)象的所有屬性被所有實(shí)例共享。
? ? ? ? 4.創(chuàng)建子類實(shí)例時(shí),無法向父類構(gòu)造函數(shù)傳參。
2.構(gòu)造繼承
核心:使用父類的構(gòu)造函數(shù)來增強(qiáng)子類實(shí)例,等于是復(fù)制父類的實(shí)例屬性給子類。

特點(diǎn):
? ? ? ? 1.解決了1中,子類實(shí)例共享父類引用屬性的問題。
? ? ? ? 2.創(chuàng)建子類實(shí)例時(shí),可以向父類傳遞參數(shù)。
? ? ? ? 3.可以實(shí)現(xiàn)多繼承(call多個(gè)父類對(duì)象)。
缺點(diǎn):
? ? ? ? 1.實(shí)例并不是父類的實(shí)例,只是子類的實(shí)例。
? ? ? ? 2.只能繼承父類的實(shí)例屬性和方法,不能繼承原型屬性和方法。
? ? ? ? 3.無法實(shí)現(xiàn)函數(shù)復(fù)用,每個(gè)子類都有父類實(shí)例函數(shù)的副本,影響性能。
3.實(shí)例繼承

特點(diǎn):
? ? ? ? ? ?1.不限制調(diào)用方式,不管是new 子類()還是子類(),返回的對(duì)象具有相同的效果
缺點(diǎn):
? ? ? ? ? ?1.實(shí)例是父類的實(shí)例,不是子類的實(shí)例
? ? ? ? ? ?2.不支持多繼承
4.拷貝繼承

特點(diǎn):
? ? ? ? 1.支持多繼承
缺點(diǎn):
? ? ? ? 1.效率較低,內(nèi)存占用高(因?yàn)橐截惛割惖膶傩裕?/p>
? ? ? ? 2.無法獲取父類不可枚舉的方法(不可枚舉方法,不能使用for in 訪問到)
5.組合繼承

特點(diǎn):
? ? ? ? 1.彌補(bǔ)了方式2的缺陷,可以繼承實(shí)例屬性/方法,也可以繼承原型屬性/方法
? ? ? ? 2.既是子類的實(shí)例,也是父類的實(shí)例
? ? ? ? 3.不存在引用屬性共享問題
? ? ? ? 4.可傳參
? ? ? ? 5.函數(shù)可復(fù)用
缺點(diǎn):
????????1.調(diào)用了兩次父類構(gòu)造函數(shù),生成了兩份實(shí)例(子類實(shí)例將子類原型上的那份屏蔽了)
6、寄生組合繼承

總結(jié):
