ES6(2)

**

类的继承extends和super关键字

**

2.1继承

现实中的继承:子承父业,比如儿子继承父亲的姓
程序中的继承:子类可以继承父类的一些属性和方法,只需写上entends就可以子类继承父类

语法:

class Father{//父类
}
class Son entends Father {//子类继承父类
}

例:

    class Father {
        constructor(){
        }
        money(){
            console.log('100元')
        }
    }
    class Son extends Father{

    }
    var son1=new Son()
    son1.money()

解释:money这个方法是在Father里面的,但是实例化son1这个对象后调用money是能够显示“100元”,所以extends作用是让子类继承父类。
当然除了本身的用法,extends继承还遵循就近原则,看以下例子

    class Father {
        say(){
            console.log('我是爸爸')
        }
    }
    class Son {
        say(){
            console.log('我是儿子')
        }
    }
    var son=new Son()
    son.say()

这一段代码毫无疑问会输出‘我是儿子’,但是下面一段代码Son继承了Father后会输出什么呢?

class Father {
        say(){
            console.log('我是爸爸')
        }
    }
    class Son extends Father{
        say(){
            console.log('我是儿子')
        }
    }
    var son=new Son()
    son.say()

这个结果也是‘我是儿子’,就算继承了父类,但是extends又一个就近原则,先去子类看一下有没有say方法,如果有则先调用子类的方法,如果没有,再去父类里调用这个方法

总结:继承中的属性或者方法查找原则:1,、继承中,如果实例化子类输出一个方法,先看子类有没有这个方法,如果有先执行子类的
2.继承中,如果子类里面没有,就去查找父类有没有这个方法,如果有,就执行父类这个方法(就近原则)

2.2super关键字

super关键字用于访问和调用对象父类上的函数。可以调用父类的构造函数,也可以调用父类的普通函数
例:
(1)调用父类中的构造函数,实现传参用父类里的sum方法

   class Father {
        constructor(m,n){
            this.m=m
            this.n=n
        }
        sum(){
            console.log(this.m+this.n)
        }
    }
    class Son extends Father{
        constructor(x,y){
            super(x,y)//调用父类的
            //this.x=x
            //this.y=y
            constructor函数,把子类的值传给父类
        }
    }
    var son1=new Son(3,5)
    son1.sum()

注释掉的代码部分可能开始会这样想,既然子传父,直接给子赋值就可以用父类里面的方法,但是赋值只给了子类,并没有给父类,所以这样会出错,因此要用super调用父类里面的constructor函数把子类的值传给父类.
(2)super关键字调用父类普通函数
调用方法:super.父类函数名()
例:

    class Father {
        say1(){
            return '我是爸爸'
        }
    }
    class Son extends Father{
        say(){
            console.log(super.say1()+'的孩子')
            //super.say1()就是调用父类中的普通函数
        }
    }
    var son=new Son()
    son.say()

结果输出的是‘我是爸爸的孩子’,通过这个例子可以知道super可以调用父类里面的普通函数的,直接super.say1().
(3)不仅传参给父类,子类也需要参数时,super必须放在赋值实例之前
在开发过程中还有一种可能,父类有加法操作,子类不仅继承父类的加法操作还想扩展减法操作
例:

class Father{
        constructor(m,n){
            this.m=m
            this.n=n
        }
        sum(){
            console.log(this.m+this.n)
        }
    }
    //子类继承父类加法,同时扩展减法方法
    class Son extends Father{
        constructor(x,y){
        //利用super调用父类构造函数
        //super必须在子类this之前
            super(x,y)
            this.x=x
            this.y=y
        }
        subtract(){
            console.log(this.x-this.y)
        }
    }
    var son2=new Son(5,3)
    son2.sum()
    son2.subtract()

父亲永远放在第一位!
注意:子类在构造函数中使用super,必须放在this前面(必须先调用父类的构造函数方法,在使用子类构造方法)

上一篇:二叉树的下一个结点


下一篇:java中的this和super关键字