1:基本概念
原型鏈?zhǔn)荍S實(shí)現(xiàn)繼承的主要方法,主要思想是使用一個(gè)引用類型繼承另一個(gè)引用類型的屬性和方法礼预。
1.1 理解一下實(shí)例把还,原型校焦,構(gòu)造函數(shù)的關(guān)系
第一句:每個(gè)構(gòu)造函數(shù)都有一個(gè)原型對(duì)象
在chrome中可以看見(jiàn)宫蛆,構(gòu)造函數(shù)father中有一個(gè)原型對(duì)象(prototype)艘包。
第二句:原型對(duì)象都包含一個(gè)指向構(gòu)造函數(shù)的指針
在原型對(duì)象(prototype)中,constructor指針指向的內(nèi)容就是構(gòu)造函數(shù)本身。因?yàn)闃?gòu)造函數(shù)又有一個(gè)原型對(duì)象想虎,所以構(gòu)造函數(shù)和原型對(duì)象互相包含卦尊,無(wú)限嵌套了下去。
第三句:而實(shí)例都包含一個(gè)指向原型對(duì)象的內(nèi)部指針
在實(shí)例father1中舌厨,內(nèi)部指針__proto__ 就和上面prototype的指向是一樣的岂却,都指向原型對(duì)象。
關(guān)系圖:
1.2 繼承實(shí)現(xiàn)原理
繼承關(guān)系圖:
2:原型鏈繼承時(shí)的注意點(diǎn)
1:所有繼承的根是Object邓线,這也就是任何對(duì)象都會(huì)有toString()或者valueOf()方法的原因淌友。
2:child繼承了father之后,child自己的原型就被替換為father的實(shí)例骇陈,所以在繼承之前,child原型上定義的屬性或方法都消失了瑰抵,因此你雌,應(yīng)該在繼承之后向child的原型添加屬性或方法。
3:在child繼承father之后二汛,不可以使用原型對(duì)象字面量的方式向child原型添加屬性和方法婿崭,原型對(duì)象字面量方式會(huì)讓child的原型直接指向Object的實(shí)例,之前的繼承會(huì)被切斷肴颊。
3:原型鏈繼承的缺陷
1:因?yàn)橐妙愋椭档脑蛯傩詴?huì)被所有實(shí)例共享氓栈,所以若father中有屬性是引用類型值,child繼承father后婿着,所有的child實(shí)例都會(huì)共享同一個(gè)引用類型屬性授瘦。
2:在創(chuàng)建child實(shí)例時(shí)無(wú)法向father的構(gòu)造函數(shù)傳遞參數(shù)。