说一下实现继承共有几种方式?

169 阅读1分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第8天,点击查看活动详情

实现继承的方式

一共有7种实现继承的方式

原型链式继承

将父类的实例作为子类的原型;

//定义一个父类型
function Father(name){
    this.name=name;
    this.say=function(){
        console.log(`我是${this.name}`);
    }
}
//原型对象方法
Father.prototype.drink=function(drinks){
 console.log(`${this.name}在喝${drinks}`);
}
function Son(){}
Son.prototype=new Father();
Son.prototype.name='小明';
var son =new Son();

缺点:创建子类实例时,无法向父类构造函数传参。

构造函数继承

//定义一个父类型
function Father(name){
    this.name=name;
    this.say=function(){
        console.log(`我是${this.name}`);
    }
}
//原型对象方法
Father.prototype.drink=function(drinks){
    console.log(`${this.name}在喝${drinks}`);
}
function Son(name,age){
 Father.call(this,name);
 this.age=age;
}
var son =new Son();

实例继承

//定义一个父类型
function Father(name){
    this.name=name;
    this.say=function(){
        console.log(`我是${this.name}`);
    }
}
//原型对象方法
Father.prototype.drink=function(drinks){
    console.log(`${this.name}在喝${drinks}`);
}
function Son(name,age){
   var p=new Father(name);//先创建子类型实例
    p.age=age;
    return p;
}
var son =new Son();

拷贝继承

无法获取父类不可for in 遍历的方法。

//定义一个父类型
function Father(name){
    this.name=name;
    this.say=function(){
        console.log(`我是${this.name}`);
    }
}
//原型对象方法
Father.prototype.drink=function(drinks){
    console.log(`${this.name}在喝${drinks}`);
}
function Son(name,age){
    var father=new Father(name);//先创建子类型实例
    for (var n in father) {
        Son.prototype[n]=father[n];

    }
    this.age=age;
}
var son =new Son();

组合继承

//定义一个父类型
function Father(name){
    this.name=name;
    this.say=function(){
        console.log(`我是${this.name}`);
    }
}
//原型对象方法
Father.prototype.drink=function(drinks){
    console.log(`${this.name}在喝${drinks}`);
}
function Son(name,age){
    Father.call(this,name);
    this.age=age;
}
Son.prototype=new Father();
Son.prototype.constructor=Son;
var son =new Son();

寄生组合继承

//定义一个父类型
function Father(name){
    this.name=name;
    this.say=function(){
        console.log(`我是${this.name}`);
    }
}
//原型对象方法
Father.prototype.drink=function(drinks){
    console.log(`${this.name}在喝${drinks}`);
}
function Son(name,age){
    Father.call(this,name);
    this.age=age;
}
(function(){
    //创建一个没有实例方法的类
    var Super=function(){};
    Super.prototype=Father.prototype;
    //将实例作为子类的原型
    Son.prototype=new Super();

})()
var son =new Son();

Es6 class extends继承

Class Father{
constructor(){

    }
    ...
}
Class Son extends Father{
    constructor(){
        super();
    }
}