js的幾種繼承,好記憶

繼承

繼承: 子類繼承父類,子類產生的實力可以使用父類中的方法。

類式繼承

​ 核心: 將子類的原型指向父類的實例

​ 注意: 給子類添加方法一定要在繼承之後(因爲原型鏈,指向的是父類的)

類式繼承的缺點:

原型對象中多了沒用的屬性

原型對象中丟失了 constructor 屬性

重複賦值過程

function People(name, age) {
    this.name = name;
    this.age  = age;
}
People.prototype.say = function(){
    console.log("我是"+ this.name);
}
function Child(name, age, sex) {
    this.name = name;
    this.age  = age;
    this.sex  = sex;
}
// 類式繼承   將子類的原型指向父類的實例
Child.prototype = new People();

var xiaoming = new Child('小明')
xiaoming.say();

爲了解決他的缺點。 解決constructor

缺少 contructor。可以手動添加一個。

Child.prototype.contructor = Child;

解決 重複賦值的過程

​ 首先提一下,爲什麼多出來無用屬性。 如果父類的屬性和子類的屬性有相同的。那麼就重複賦值。但是會用子類的屬性。 (就近)

構造函數繼承(不是真正的繼承)

繼承是子類使用父類的方法,構造函數繼承是不能的

function People(name, age) {
    this.name = name;
    this.age  = age;
}
People.prototype.say = function(){
    console.log("我是"+ this.name);
}
function Child(name, age, sex) {
    //構造函數繼承
    People.apply(this, arguments);
    this.sex  = sex;
}

var xiaoming = new Child('小明')
xiaoming.say();

子類是不能調用父類的方法,所以他不是 真正的繼承。

組合繼承

類式繼承+ 構造函數繼承

function People(name, age) {
    this.name = name;
    this.age  = age;
}
People.prototype.say = function(){
    console.log("我是"+ this.name);
}
function Child(name, age, sex) {
    //構造函數繼承
    People.apply(this, arguments);
    this.sex  = sex;
}
// 類式繼承   將子類的原型指向父類的實例
Child.prototype = new People();

var xiaoming = new Child('小明')
xiaoming.say();

解決 多出來無用屬性

爲什麼會多出來無用屬性呢, 是 因爲 子類的 原型 指向 父類的實例, 父類是有方法體的, 實例化的時候,就會有方法體中所有屬性。 所以要解決這個, 需要一個空方法體的函數, 來做這個中間件。

寄生式繼承

function People(name, age) {
    this.name = name;
    this.age  = age;
}

function Child(name) {
    this.name = name;
}

// 寄生式繼承
function JiSheng(Child, Perple) {
    function F(){};
    F.prototype = People.prototype;
    Child.prototype = new F();
}
JiSheng(Child, People);
People.prototype.say = function() {
    console.log('我要'+ this.name + "說話");
}

var xiaoming = new Child('小明');

xiaoming.say();

寄生式組合繼承

​ 寄生式+ 構造函數

function People(name) {
    this.name = name;
    
}

function Child(name, age) {
    People.apply(this, arguments);
    this.age  = age;
}

// 寄生式繼承
function JiSheng(Child, Perple) {
    function F(){};
    F.prototype = People.prototype;
    Child.prototype = new F();
}
JiSheng(Child, People);
People.prototype.say = function() {
    console.log('我要'+ this.name + "說話");
}

var xiaoming = new Child('小明');

xiaoming.say();
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章