js繼承 到繼承結束

2022-03-25 04:51:51 字數 3604 閱讀 4646

說到繼承,其它語言裡可能有兩種:介面繼承是繼承方法簽名,而實現繼承則繼承實際方法。es函式沒有簽名,不能實現介面繼承,只支援實現繼承,而實現繼承主要依靠原型鏈。(這兩句話,說來輕鬆,理解來不易,且行且珍惜吧~)。

所以,理解原型鏈是掌握繼承的必要條件。乙個原型物件等與另乙個型別的例項

為什麼demo.constructor ===parent;呢? 因為demo.prototype指向parent例項,而parent.prototype.constructor指向parent,因此demo.constructor繼承自 parent.prototype,所以指向parent;

使用原型練實現繼承:說明:不能用物件字面量建立原型方法,因為這樣會重寫原型鏈。

缺點:1.引用型別值的原型屬性會被所有例項共享,因此在建構函式中定義屬性,但通過原型繼承時,乙個型別的例項會變成另乙個物件的原型。因此例項中的屬性就變成了現在的原型的屬性了。2.沒有辦法在不影響所有物件的情況下,向超型別傳參。

為了解決引用型別帶來的問題——>借用建構函式(偽造物件、經典繼承 ):在子型別建構函式的內部呼叫超型別建構函式

function

parent()

function

child()

var c1 = new

child();

var c2 = new

child();

c1.friends.push("d");

c1.friends

//["a", "b", "c", "d"]

c2.friends //

["a", "b", "c"]

c2.age //

23

借用建構函式的缺點:無法避免建構函式模式的缺點,方法不能復用,而且超類原型中的方法,對於子型別是不可見的,所以只能統一使用建構函式模式。

為了避免這些缺點——>組合繼承(偽經典繼承):使用原型鏈實現對原型屬性和方法的繼承,而通過建構函式實現對例項屬性的繼承

function

parent(name)

parent.prototype.sayname = function

()function

child(name, age)

child.prototype = new

parent();

var c1 = new child("tom", 34);

var c2 = new child("joe", 22);

c1.friends.push("d");

c2.friends

//["a", "b", "c"]

c1.sayname(); //

"tom"

組合繼承避免了原型鏈和借用建構函式的缺陷,融合了它們的優點。成為js中最常用的繼承模式。

此外還有幾種繼承模式——>原型式繼承:借用原型基於已有的物件建立新的物件,同時還不必因此建立自定義型別。

function

object(o)

f.prototype =o;

return

newf();

}var person =;

var p1=object(person);

p1.name = "marry";

p1.friends.push("d");

var p2 =object(person);

p2.name = "joe";

p2.friends.push("e");

person.friends

//["a", "b", "c", "d", "e"]

object()函式中建立了乙個臨時建構函式,並將傳入的物件作為該建構函式的原型。相當於進行一次淺複製。和原型模式一樣,引用型別始終會被共享。其中es5定義了object.create()方法規範了原型繼承。

因此,在沒必要興師動眾的建立建構函式,而只想讓乙個物件與另乙個物件保持類似的情況下,原型式模式是個不錯的選擇。

function

createanother(o);

return

clone;

}var person =;

var p =createanother(person);

p.sayhi()

//"hi"

在主要考慮物件而不是自定義型別和建構函式的情況下,寄生式也是一種有用的模式,object()非必須,任何能返回新物件的函式都適用於此模式組合模式是最常用的繼承模式,但是組合模式兩次呼叫超型別建構函式,

為了解決這個問題——>寄生組合模式:使用建構函式繼承屬性,通過原型鏈的混成形式繼承方法;不必為了指定子型別的原型而呼叫超型別的建構函式,我們可以使用寄生式繼承繼承超型別的原型,然後再將結果指定給子型別的原型。

function

inheritprototype(c, p)

function

parent(name)

parent.prototype.sayname = function

()function

child(name, age)

inheritprototype(child, parent);

child.prototype.sayage = function

();

組合繼承模式:集寄生模式和組合模式優點於一身,是實現基於型別繼承最有效最理想的方式。

js繼承(一)原型繼承

正式開工了 繼承在js中有著很大的地位,同時理解起來也比較抽象,我將分幾篇部落格來記錄js的繼承。原型繼承 相當於將父類物件與子類物件打通橋梁,可以靈活實現追加屬性與行為 子類擁有父類的一切行為和屬性。特點 非常純粹的繼承關係,例項是子類的例項,也是父類的例項 父類新增原型方法 原型屬性,子類都能訪...

js繼承,原型鏈繼承

1 乙個型別的物件能夠訪問另外乙個型別的屬性和方法 2 類與類之間的關係 類就是眾多例項共有的屬性和方法的乙個抽象 function animal name animal.prototype.say function function dog 把子類的原型指向父類的例項 dog.prototype ...

js繼承之原型繼承

物件導向程式設計都會涉及到繼承這個概念,js中實現繼承的方式主要是通過原型鏈的方法。每建立乙個函式,該函式就會自動帶有乙個prototype屬性。該屬性是個指標,指向了乙個物件,我們稱之為原型物件。什麼是指標?指標就好比學生的學號,原型物件則是那個學生。我們通過學號找到唯一的那個學生。假設突然,指標...