js
裡常用的如下兩種繼承方式:
原型鏈繼承(物件間的繼承)
類式繼承(建構函式間的繼承)
在物件導向的語言中,我們使用類
來建立乙個自定義物件。然而js
中所有事物都是物件,那麼用什麼辦法來建立自定義物件呢?這就需要用到js
的原型:
我們可以簡單的把prototype
看做是乙個模版,新建立的自定義物件都是這個模版(prototype
)的乙個拷貝 (實際上不是拷貝而是鏈結,只不過這種鏈結是不可見,新例項化的物件內部有乙個看不見的__proto__
指標,指向原型物件)。
js
可以通過建構函式和原型的方式模擬實現類的功能。 另外,js
類式繼承的實現也是依靠原型鏈來實現的。
類式繼承
是在子型別建構函式的內部呼叫超型別的建構函式。
嚴格的類式繼承並不是很常見,一般都是組合著用:
function super()
function sub()
原型式繼承
是借助已有的物件建立新的物件,將子類的原型指向父類,就相當於加入了父類這條原型鏈
為了讓子類繼承父類的屬性(也包括方法),首先需要定義乙個建構函式。然後,將父類的新例項賦值給建構函式的原型。**如下:
以上原型鏈繼承還缺少一環,那就是object
,所有的建構函式都繼承自object
。而繼承object
是自動完成的,並不需要我們自己手動繼承,那麼他們的從屬關係是怎樣的呢?
可以通過兩種方式來確定原型和例項之間的關係。操作符instanceof
和isprototypeof()
方法:
alert(brother instanceof object)//true
alert(test instanceof brother);//false,test 是brother的超類
alert(brother instanceof child);//true
alert(brother instanceof parent);//true
只要是原型鏈中出現過的原型,都可以說是該原型鏈派生的例項的原型,因此,isprototypeof()
方法也會返回true
在js
中,被繼承的函式稱為超型別(父類,基類也行),繼承的函式稱為子型別(子類,派生類)。使用原型繼承主要由兩個問題:
一是字面量重寫原型會中斷關係,使用引用型別的原型,並且子型別還無法給超型別傳遞引數。
偽類解決引用共享和超型別無法傳參的問題,我們可以採用「借用建構函式」技術
借用建構函式雖然解決了剛才兩種問題,但沒有原型,則復用無從談起,所以我們需要原型鏈+借用建構函式
的模式,這種模式稱為組合繼承
組合式繼承是比較常用的一種繼承方法,其背後的思路是 使用原型鏈實現對原型屬性和方法的繼承,而通過借用建構函式來實現對例項屬性的繼承。這樣,既通過在原型上定義方法實現了函式復用,又保證每個例項都有它自己的屬性
這種繼承借助原型並基於已有的物件建立新物件,同時還不用建立自定義型別的方式稱為原型式繼承
原型式繼承首先在obj()
函式內部建立乙個臨時性的建構函式 ,然後將傳入的物件作為這個建構函式的原型,最後返回這個臨時型別的乙個新例項。
這種繼承方式是把原型式+工廠模式結合起來,目的是為了封裝建立的過程。
組合式繼承是js
最常用的繼承模式,但組合繼承的超型別在使用過程中會被呼叫兩次;一次是建立子型別的時候,另一次是在子型別建構函式的內部
以上**是之前的組合繼承,那麼寄生組合繼承,解決了兩次呼叫的問題。
// 定義乙個全域性函式
function foo()
// 定義乙個全域性變數
// 自定義乙個物件
var pack = ;
// 等價於window.foo();
// 此時foo中的this === pack
JavaScript實現繼承方式
student.prototype new person 得到乙個 person 例項,並且這個例項指向構造器的 prototype 屬性和呼叫了建構函式,因為呼叫的建構函式,而 student 只是乙個類,並沒有例項化,只為了繼承,呼叫建構函式建立乙個例項,引數的問題就不容易解決。例如 當 per...
JavaScript 繼承方式詳解
js 中實現繼承有兩種常用方式 原型鏈繼承 物件間的繼承 類式繼承 建構函式間的繼承 在物件導向的語言中,可以使用類來建立乙個自定義物件,當然es6中也引入了class來建立類。在這之前,我們需要使用js的原型來建立自定義物件。類繼承是在子型別建構函式的內部呼叫父型別的建構函式 function s...
JavaScript繼承的多種方式
1.原型鏈繼承 function a firstname a.prototype.getfirstname function function b lastname b.prototype newa 遠 b.prototype.getlastname function var person newb...