談談JS繼承

2021-10-01 10:28:44 字數 2869 閱讀 3908

function

parent

(value)

parent.prototype.

getparentvalue

=function()

function

child()

child.prototype =

newparent()

var child =

newchild()

child.

getparentvalue()

// 'parent'

這裡 child 繼承了 parent,實現的本質是重寫原型物件 child.prototype,代之以乙個新型別的例項 new parent()。

so,原來存在於 parent 的例項中的所有屬性和方法,現在也存在於 child.prototype 中了

關係圖如下:

原型鏈的問題

1、包含引用型別值的原型屬性會被所有例項共享

在通過原型來實現繼承時,原型實際上會變成另乙個型別的例項。於是,原先的例項屬性也就順理成章地變成了現在的原型屬性了,這樣就可能引起問題,見下?:

function

parent

(value)

function

child()

child.prototype =

newparent()

var child1 =

newchild()

var child2 =

newchild()

child1.foods.

push

('pear'

)

在實現原型鏈的過程中,這裡的 foods 屬性從parent的例項屬性轉化為child的原型屬性了,所以child的所有例項都會共享foods,一改全改

2、不能傳遞引數

沒有辦法在不影響所有物件例項的情況下,給超型別的建構函式傳遞引數

在子型別建構函式中通過 call() 「借調」父型別的建構函式,可以解決原型中包含引用型別值所帶來問題,見下?:

function

parent

(value)

function

child()

child.prototype =

newparent()

var child1 =

newchild()

var child2 =

newchild()

child1.foods.

push

('pear'

)

還支援傳遞引數,見下?:

function

parent

(name)

function

child()

child.prototype =

newparent()

var child =

newchild()

child.name // 'sally'

child.age // 23

建構函式繼承的問題方法都在建構函式中定義,無法實現函式復用。而且,在父型別的原型中定義的方法,對子型別而言也是不可見的,結果所有型別都只能使用建構函式模式

將原型鏈和借用建構函式的技術組合到一塊,從而發揮二者之長的一種繼承模式

function

parent

(value)

parent.prototype.

getvalue

=function()

function

child

(value)

child.prototype =

newparent()

const child =

newchild(1

)child.

getvalue()

// 1

以上繼承的方式核心是在子類的建構函式中通過 parent.call(this)繼承父類的屬性,然後改變子類的原型為 new parent() 來繼承父類的函式

優點:建構函式可以傳參,不會與父類引用屬性共享,可以復用父類的函式

缺點:在繼承父類函式的時候呼叫了父類建構函式,導致子類的原型上多了不需要的父類屬性,存在記憶體上的浪費。

這種繼承方式對組合繼承進行了優化

function

parent

(value)

parent.prototype.

getvalue

=function()

function

child

(value)

child.prototype = object.

create

(parent.prototype,})

const child =

newchild(1

)child.

getvalue()

// 1

以上繼承實現的核心就是將父類的原型賦值給了子類,並且將建構函式設定為子類,這樣既解決了無用的父類屬性問題,還能正確的找到子類的建構函式。

談談js中的繼承

我們這裡這裡主要討論js中的主要繼承方式,包括建構函式繼承,原型繼承,組合式繼承 原型繼承和建構函式繼承的組合 寄生繼承 原型繼承的變形 和寄生組合式繼承 寄生繼承和建構函式繼承的組合 建構函式繼承 function supertype name supertype.prototype.saynam...

談談Js繼承的那些事兒

1.使用物件冒充實現繼承 實現原理 讓父類的建構函式成為子類的方法,然後呼叫該子類的方法,以實現物件的繼承。var people function name,age people.prototype.showpinfo function var men function men.prototype....

談談JS閉包

定義 閉包是指有權訪問另乙個函式作用域中變數的函式。1 閉包與變數 作用域鏈的這種配置機制引出了乙個值得注意的 即閉包只能取得包含函式中任何變數的最後乙個值。我們首先來看乙個很常見的場景 function createfunction return result 這個函式會反回乙個函式陣列。表面上看...