對(duì)象繼承的方式
這篇是上一篇的姐妹篇,面試中你有被問(wèn)到-javascript中有幾種創(chuàng)建對(duì)象的方式嗎?這兩篇結(jié)合起來(lái),能更好地理解對(duì)象。開(kāi)始吧!
01
原型鏈
原理:將父類的實(shí)例賦給子類的prototype

缺點(diǎn):
實(shí)例的類型是不能直觀看到的;
在創(chuàng)建子類型時(shí),雖然可以傳參,但容易造成修改的混亂。
02
構(gòu)造函數(shù)結(jié)合原型鏈
原理:
使用call繼承構(gòu)造函數(shù)的屬性和方法;
將父類的實(shí)例賦給子類的prototype繼承父類的屬性和方法,以及構(gòu)造函數(shù)原型的方法

缺點(diǎn):
由于調(diào)用了兩次父類的構(gòu)造函數(shù),所以子類的原型中多了很多多余的屬性
03
原型式繼承
Object.getPrototypeOf()方法可以用來(lái)從子類上獲取父類,判斷一個(gè)類是否繼承了另一個(gè)類
Object.setPrototypeOf(),為現(xiàn)有對(duì)象設(shè)置原型,返回一個(gè)新對(duì)象:?
接收兩個(gè)參數(shù):第一個(gè)是現(xiàn)有對(duì)象,第二是原型對(duì)象。

缺點(diǎn):
不能傳參,即使傳參也會(huì)被忽略
04
寄生式繼承
原理:利用Object.create()將父類復(fù)制給子類,子類再進(jìn)行拓展

缺點(diǎn):
使用不方便
05
寄生式組合繼承
原理:
利用call()獲取父類的屬性和方法,并將指針指向子類
利用Object.defineProperty獲取Person.prototype中的屬性和方法
Object.defineProperty方法直接在一個(gè)對(duì)象上定義一個(gè)新屬性,或者修改一個(gè)已經(jīng)存在的屬性, 并返回這個(gè)對(duì)象。?
Object.defineProperty 需要三個(gè)參數(shù)(object , propName , descriptor)
?1 object 對(duì)象 => 給誰(shuí)加
?2 propName 屬性名 => 要加的屬性的名字 【類型:String】
?3 descriptor 屬性描述 => 加的這個(gè)屬性有什么樣的特性【類型:Object】

06
????extends關(guān)鍵字實(shí)現(xiàn)繼承
super作為函數(shù)調(diào)用時(shí),代表父類的構(gòu)造函數(shù)--ES6要求,子類的構(gòu)造函數(shù)必須執(zhí)行一次super函數(shù),否則會(huì)報(bào)錯(cuò);
super雖然代表了父類Person的構(gòu)造函數(shù),但返回的是子類Coder的實(shí)例,即super內(nèi)部的this指向的是Coder的實(shí)例。因此super()在這里相當(dāng)于Person.prototype.contructor.call(this)
