讓子類的原型物件指向父類的例項,當子類的例項找不到對應的方法時,就按原型鏈往上找。
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.繼承抽象類時需要注...