JS中的多种继承

本文深入讲解JavaScript中的三种经典继承方式:原型继承、call继承及寄生组合式继承,同时介绍了ES6中的类和继承语法。原型继承使子类实例共享父类属性方法,call继承实现私有属性的拷贝,寄生组合式继承结合两者优势。
  1. JS中第一种继承方案:原型继承(让子类的原型等于父类的实例即可)
    原型继承:
    (1)父类中私有的和公有的属性方法,最后变为子类实例公有的
    (2)和其他不同,原型继承并会把父类的属性方法“拷贝”给子类,而是让子类实例基于__proto__原型链找到自己定义的属性和方法( “指向/查找”方法)
   <script>
    function Parent(){
        this.x=100;
    }
    Parent.prototype.getX=function getX(){
        return this.x=x;
    };
    function Child(){
        this.y=20;
    }
    Child.prototype=new Parent;   //原型继承
    Child.prototype.getY=function getY(){
        return this.y;
    };
    let c1=new Child;
    console.log(c1);
    </script>

在这里插入图片描述

  1. JS中第二种继承方式,CALL继承,只能继承父类私有的属性。
    <script>
    function Parent(){
        this.x=100;
    }
    Parent.prototype.getX=function getX(){
        return this.x=x;
    };
    function Child(){
        //在子类构造函数中,把父类当作普通方法执行(没有父类实例,父类原型上的那些也就没关系了)
        //this是child的实例c1
        Parent.call(this); //this.x=100相当于强制给c1这个实例设置一个私有的属性x,属性值100,相当于让子类的实例继承了父类的私有的属性,并且也变为了子类私有属性“拷贝式”       
        this.y=20;
    }
    Child.prototype.getY=function getY(){
        return this.y;
    };
    let c1=new Child;
    console.log(c1);
    </script>  
  1. JS中第三种继承,寄生组合式继承(CALL继承+另类原型继承)
    <script>
    function Parent(){
        this.x=100;
    }
    Parent.prototype.getX=function getX(){
        return this.x=x;
    };
    function Child(){
        //在子类构造函数中,把父类当作普通方法执行(没有父类实例,父类原型上的那些也就没关系了)
        //this是child的实例c1
        Parent.call(this); //this.x=100相当于强制给c1这个实例设置一个私有的属性x,属性值100,相当于让子类的实例继承了父类的私有的属性,并且也变为了子类私有属性“拷贝式”       
        this.y=20;
    }
    // Child.prototype.__proto__=Parent.prototype;   //IE下不支持
    Child.prototype=Object.create(Parent.prototype);
    Child.prototype.constructor=Child;
    Child.prototype.getY=function getY(){
        return this.y;
    };
    let c1=new Child;
    console.log(c1);
    </script>

在这里插入图片描述

  1. ES6中的类和继承,使用class,不能当作普通函数执行,只能new执行。
    <script>
        class Parent{
            constructor(){
                this.x=101;  //私有属性
            }
            //Parent.prototype.getX=function...
            getX(){
                return this.x;
            }
        }
        //继承:extends Parent
        //注意:继承后一定要在constructor第一行加上super
        class Child extends Parent{
            constructor(){
                super();  //类似于我们之前的CALL继承,super(100,200):相当于把Parent中的constructor执行,传递了100和200
                this.y=20;
            }
            getY(){
                return this.y;
            }
        }
        
    </script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值