ES6——Class 类的继承 extends

  • Post author:
  • Post category:其他


node.js中会用到类的继承封装,vue中不用(使用函数对象)



1.举例

Class 可以通过extends关键字实现继承,这比 ES5 的通过

修改原型链

实现继承,要清晰和方便很多

  • 子类必须在constructor方法中调用

    super

    方法,否则新建实例时会报错

  • ES5 的继承,实质是先创造子类的实例对象this,然后再将父类的方法添加到this上面(Parent.

    apply

    (this))

  • ES6 的继承机制完全不同,实质是先将父类实例对象的属性和方法,加到this上面(所以必须

    先调用super

    方法),然后再用子类的构造函数修改this【否则会报错】

(1)

	//子类拿到父类相关属性和方法
    class getColor extends Point{
        constructor(color,x,y){
            //继承后super关键字 指父类的构造函数
            //先将父类的属性和方法给子类,再去使用this
            super();
            this.color=color;

        };
    }
    let color=new getColor("blue",12,22);
    console.log(color);

在这里插入图片描述

(2)

    class Person{
        name;
        age;
        sex;
        constructor(name,age,sex){
            this.name=name;
            this.age=age;
            this.sex=sex;
        }
        //上面都是构造属性 下面都是原型方法
        eat(){

        }
        sleep(){
            console.log(`${this.name}开始睡觉`);
        }
    }
    class Student extends Person{
        job;
        constructor(name,age,sex,job){
            super(name,age,sex);
            this.job=job;
        }
    }
    let stu=new Student("小明",20,"男","学生");
    console.log(stu);
    stu.sleep();

在这里插入图片描述



2.Object.getPrototypeOf() 获取子类的父类

console.log(Object.getPrototypeOf(color)); //Point



3.super关键字

super这个关键字,既可以当作函数使用,也可以当作对象使用

(1)super作为函数调用时,代表父类的构造函数

同1中的举例

(2)super作为对象时,在普通方法中,指向父类的原型对象;在静态方法中,指向父类

    class Point{
        constructor(x,y){
            this.x=x;
            this.y=y;
        }
        getPos(){
            console.log(`坐标(${this.x},${this.y})`);
        }
    }
    //子类拿到父类相关属性和方法
    class getColor extends Point{
        constructor(color,x,y){
            super(x,y); //当函数使用,指父类的构造函数
            this.color=color;

            super.getPos(); //当对象使用,指父类原型对象   输出坐标(12,22)
        };
    }

静态方法中:

    class Point{
        static pos;
        constructor(x,y){
            this.x=x;
            this.y=y;
        }
        getPos(){
            Point.pos=[this.x,this.y];
        }
    }
    //子类拿到父类相关属性和方法
    class getColor extends Point{
        constructor(color,x,y){
        	super(x,y); //当函数使用,指父类的构造函数
        };
        static getvalue(){
            console.log(super.pos); //在静态方法中,指代父类  输出[12, 22]
        }
    }
    getColor.getvalue();



4.类的 prototype 和__proto__属性

大多数浏览器的 ES5 实现之中,每一个对象都有__proto__属性,指向对应的构造函数的prototype属性。

Class 作为构造函数的语法糖,同时有prototype属性和__proto__属性,因此同时存在两条继承链

(1)子类的__proto__属性,表示

构造函数

的继承,总是指向父类。

(2)子类prototype属性的__proto__属性,表示

方法

的继承,总是指向父类的prototype属性。

    class A{

    }
    class B extends A{

    }
    console.log(B.__proto__ === A); //true
    console.log(B.prototype.__proto__ == A.prototype); //true

    //子类的原型链还是本身,只是名称变了
    console.log(B.prototype); //A {constructor: ƒ}

在这里插入图片描述



版权声明:本文为ling_xy原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。