js-----繼承

子類繼承父類

  • 繼承 子類繼承父類
  • 封裝 爲實例添加方法 爲原型增長方法
  • 多態 重寫或重載
  1. 原型鏈繼承 將子類的原型對象 重寫成一個父類的一個實例
子類.prototype = new 父類();  //把父類的全部屬性 都變成子類的公有屬性
複製代碼
  • 缺點 改寫子類的原型對象 會致使子類原型對象上的constructor 屬性會被改寫 須要從新指定繼承後的constructor
  1. 借用構造函數繼承 把父類的私有屬性和方法即成爲子類的私有屬性和方法
  • 把父類當作普通函數 在子類的函數體中經過call執行父類的函數
  • call方法是用來 修改this的指向 函數A中經過this.xxx = xxx 添加的屬性都添加到了B的實例身上
  • 特色 只能把父類的私有屬性和方法繼承子類的私有屬性和方法
  1. 組合繼承 原型鏈繼承 + 借用構造函數繼承
  • 缺點 父類的私有屬性繼承了兩次 一次繼承在了子類的公有屬性上 一次繼承在了子類的私有屬性上
  1. 原型式繼承 把父類的公有屬性繼承爲子類的公有屬性
  • 建立一個新的對象 而且對象的__proto__ 指向父類的prototype
  • 最後把這個新對象做爲子類的原型
  • 建立一個對象 對象的__proto__指向obj Object.create(obj);
B.prototype = Object.create(A.prototype); // 建立一個指定原型的對象 建立一個對象,而且這個對象的 __proto__ 指向 A.prototype
B.prototype.constructor = B; // 原型式繼承一樣是修改 B 類原型的指向,因此須要從新指定構造函數
let b = new B(); 
複製代碼
  1. 寄生組合繼承 原型式繼承 + 借用構造函數繼承
  2. 冒充對象繼承 在子類的構造函數中生成一個父類的實例 把父類的實例進行遍歷 把屬性都添加到子類的實例上

ES6 的 繼承 extends 關鍵字 原理 寄生組合式繼承

class A{
    constructor(name,age){
        this.name = name;
        this.age = age;
    }
    //公有方法----添加到原型上
    say(){
        console.log(`${this.name} say`);
    }
}
//繼承
class B extends A{
    constructor(x,y,forName,forAge){
        super(forName,forAge);
        this.x = x;
        this.y = y;
    }
}
let b = new B('x','y','zhangsaan',12);
b.say();
複製代碼

在使用 ES6 的 extends 關鍵字以前,必須使用 super(); super 表示父類的構造函數bash

相關文章
相關標籤/搜索