這里介紹的是ES6之前的繼承方式,沒有寫 class 繼承哦。
什么是繼承
繼承是指一個(gè)對(duì)象直接使用另一對(duì)象的屬性和方法。
js中繼承的方法有:原型鏈繼承、構(gòu)造函數(shù)繼承、組合繼承、原型式繼承、寄生式繼承、寄生式組合繼承
1. 原型鏈繼承
(1). 原型、構(gòu)造函數(shù)和實(shí)例的關(guān)系
function Person() { } Person.prototype var p = new Person();
構(gòu)造函數(shù):Person
屬性:prototype => 指向原型對(duì)象
原型對(duì)象:Person.prototype
屬性:constructor => 指向構(gòu)造函數(shù)
原型、構(gòu)造函數(shù)和實(shí)例的關(guān)系:

出現(xiàn)上面那個(gè)結(jié)果的原因是,實(shí)例是沒有constructor這個(gè)屬性的,p.constructor其實(shí)是訪問的p.prototype.constructor,但是由于我們用對(duì)象字面量的方式重寫了Person.prototype,所以會(huì)順著原型鏈往上找,找到
Object.prototype.constructor.

(2). 原型鏈
如(1)中所示,如果讓(1)中的原型對(duì)象成為另外一個(gè)類型的實(shí)例,以此類推,便構(gòu)成了原型鏈。
注意:所有構(gòu)造函數(shù)的默認(rèn)原型都是Object的實(shí)例,因此默認(rèn)原型會(huì)有一個(gè)prototype指針指向Object.prototype。
(3). 原型鏈繼承
主要思想是:通過設(shè)定一種類型的原型是另一種類型的實(shí)例來繼承另外一種類型。
例如:B要繼承A
創(chuàng)建A的實(shí)例:new A();
讓其等于B的原型:B.prototype = new A(); //B則繼承了A里面所有的屬性和方法
原型搜索機(jī)制:以讀取方式訪問一個(gè)實(shí)例屬性時(shí),在該實(shí)例中搜索該屬性,若沒有找到再搜索實(shí)例的原型,順著原型鏈往上找。
代碼示例如下:

原型繼承的缺點(diǎn):
(1).超類型中有引用類型(color是一個(gè)數(shù)組)的屬性時(shí),子類型繼承超類型,一個(gè)子類型中對(duì)該引用類型修改,會(huì)反應(yīng)到所有的子類型上。所有子類型共享超類型的引用類型.
例如:

(2).創(chuàng)建子類型實(shí)例時(shí)無法向超類型的構(gòu)造函數(shù)中傳遞參數(shù)
2. 構(gòu)造函數(shù)繼承
利用call()和Apply()方法在新的對(duì)象上執(zhí)行超類型的構(gòu)造函數(shù)。
超類型:指的是被繼承的類型。
a.func.call(b) /*指的是a對(duì)象的方法應(yīng)用到b對(duì)象上*/ a.func.apply(b) // 主要是參數(shù)的區(qū)別
代碼示例:

構(gòu)造函數(shù)繼承的優(yōu)點(diǎn):
使子類Child在創(chuàng)建對(duì)象的同時(shí)傳遞參數(shù)到父類Parent
構(gòu)造函數(shù)繼承的缺點(diǎn):
無法進(jìn)行函數(shù)的復(fù)用,a的原型中定義的方法也無法繼承。
3. 組合繼承(將原型鏈繼承和借用構(gòu)造函數(shù)繼承組合起來)
主要思想是:使用原型鏈實(shí)現(xiàn)對(duì)a原型屬性和方法的繼承,通過構(gòu)造函數(shù)實(shí)現(xiàn)對(duì)a實(shí)例屬性的繼承。
代碼示例如下:

缺點(diǎn):要調(diào)用兩次超類型的構(gòu)造函數(shù)(注釋的兩個(gè)地方)
4. 原型式繼承
主要思想是:實(shí)現(xiàn)對(duì)父類的淺復(fù)制,產(chǎn)生一個(gè)副本
Object.create()函數(shù)實(shí)現(xiàn)的就是原型式繼承
代碼示例如下:

這種繼承方式是將child的原型設(shè)為parent,通過child可以訪問parent的屬性和方法,而不需要將同名屬性和方法在child里面再重新定義一遍。
Object.create() 可接收兩個(gè)參數(shù),第一個(gè)參數(shù)是需要繼承的對(duì)象,第二個(gè)參數(shù)是新生成的對(duì)象中新增加的屬性和方法。

5. 寄生式繼承
主要思想:寄生式繼承是基于原型式繼承,創(chuàng)建一個(gè)僅用于封裝繼承的函數(shù)
代碼示例如下:

歡迎關(guān)注。