繼承學習總結

2022-09-09 20:12:25 字數 3375 閱讀 9641

讓子類的原型物件指向父類的例項,當子類的例項找不到對應的方法時,就按原型鏈往上找。

function parent()

// 原型上掛載方法

parent.prototype.getname = function()

function chind()

// 原型鏈繼承

chind.prototype = new parent();

//原型鏈繼承會改變constructor指向,要設定重新指回

chind.prototype.constructor = chind;

let mychild1 = new chind();

let mychild2 = new chind();

mychild1.name[0] = "咕咕咕";

console.log(mychild1.name); //["咕咕咕"]

mychild2.getname(); //["咕咕咕"]

弊端:

原型都指向同乙個parent例項,當有兩個子類例項化物件時,其中乙個修改了parent的內容,那麼另乙個例項也會受到影響。

原型鏈繼承會改變constructor指向,要設定重新指回

無法對父類進行super傳參。

在子類的建構函式中,去執行父類的建構函式,並繫結子類的this

// 構造方法繼承

function parent(name)

// 原型上掛載方法

parent.prototype.getname = function()

function chind()

let mychild1 = new chind();

let mychild2 = new chind();

mychild1.name = "咕咕咕";

console.log(mychild1.name); //"咕咕咕"

console.log(mychild2.name); // fct

mychild2.getname(); //報錯,構造方法繼承不能繼承父類原型上的屬性和方法

弊端:

構造方法繼承解決了子類例項都指向同乙個父類例項,但構造方法繼承不能繼承父類原型上的屬性和方法

組合繼承 = 建構函式繼承 + 原型鏈繼承

// ----組合繼承-----

function parent(name)

parent.prototype.getname = function ()

function child()

child.prototype = new parent();

child.prototype.constructor = child;

let mychild1 = new child();

let mychild2 = new child();

mychild1.name = "咕咕咕";

console.log(mychild1.name); // 咕咕咕

console.log(mychild2.name); // 小桃子

mychild2.getname(); // 小桃子

缺點:每生成乙個子類例項就得new 乙個父類例項和執行一次call函式。導致父類建構函式始終會被呼叫兩次。

function parent(name)

parent.prototype.getname = function ()

function child()

child.prototype = parent.prototype;

child.prototype.constructor = child;

child.prototype.print = function ()

let mychild1 = new child();

let mychild2 = new child();

mychild1.name[0] = "咕咕咕";

console.log(mychild1.name); // 咕咕咕

console.log(mychild2.name); // 水雲身

mychild2.getname(); // 水雲身

mychild1.print(); //我是child

let myparent = new parent();

myparent.print(); //我是child

缺點:避免了父類建構函式始終被呼叫兩次,但子類對原型上的修改會影響(汙染)父類的原型。

基本思路:不通過呼叫父類建構函式給子類原型賦值,而是取得父類原型的乙個副本。

function parent(name)

parent.prototype.getname = function ()

function child()

//子類原型 = 父類原型的乙個副本

child.prototype = object.create(parent.prototype);

child.prototype.constructor = child;

child.prototype.print = function ()

let mychild1 = new child();

let mychild2 = new child();

let myparent = new parent();

mychild1.name = "咕咕咕";

console.log(mychild1.name); // 咕咕咕

console.log(mychild2.name); // 卿雲

mychild2.getname(); // 卿雲

myparent.getname(); //undefined

mychild1.print(); //我是child

myparent.print(); //報錯:myparent.print is not a function

子類原型上的修改不會影響到父類原型。寄生式組合繼承算是繼承的最佳模式

繼承學習總結

繼承就是在乙個已存在的類的基礎上建立乙個新的類,已存在的類稱為 基類 或者叫父類。新建立的類稱為 派生類 乙個新類從已有的類那裡獲得已有的特性,這種現象叫繼承。派生類繼承了父類的全部資料成員和成員函式。我們在建立了乙個類a後,之後可能還需要建立另乙個類b,但是類b是在類a的基礎上新增了一些東西,可能...

c 繼承學習總結

繼承 在已有類的基礎上創造新類。其中已有類稱為基類或父類,創造出的新類稱為派生類或子類。繼承的格式為 class 派生類名 基類名。繼承的型別我們一般都是使用公有繼承。在繼承時需要將基類的資料成員宣告為保護型別,因為派生類無法直接使用基類的私有成員。派生類中包括了基類中的所有成員 除建構函式和析構函...

繼承 多型 抽象 學習總結

1.為什麼要使用繼承 是為了減少重複的 讓我們的功能得以擴充套件。2.抽象方法的特點是什麼 a.抽象方法沒有方法體 b.有抽象方法的類必須是抽象類 c.抽象方法前面必須要加abstract。3.抽象類有哪些特點 a.抽象類都是父類,他的下面有子類 b.不能被例項化,只能被繼承 4.繼承抽象類時需要注...