class的继承(笔记)

2019-09-28  本文已影响0人  灰灰_82a6

子类通过extends关键字继承父类。

class Par{
    constructor(){
        this.num=21;
    }
}
class  Chil  extends Par{
    constructor(){
      //继承父类的构造函数constructor
        super() //这里必须写,否则下面实例会报错。
    }
}

var p=new Chil();
console.dir(p.num) //21

注意:子类必须在constructor方法中调用super方法,否则新建实例时会报错。这是因为子类实例的构建,基于父类实例,只有super方法才能调用父类实例。

ES5 继承和ES6 继承对比

super关键字

1.可以当函数用。
super作为函数调用时,代表父类的构造函数。

class A {}

class B extends A {
  constructor() {
    super();
  }
}

注意:

2.可以作为对象使用。
super 作为对象使用时, 在普通的方法中,指向的是父类的原型对象。在静态方法中,指向的是父类。

class A {
  constructor() {
    // 这里是实例上的属性
    this.p = 1;
  }
  // 普通方法,放在A原型上的。
  say(){
    console.log("普通方法")
  }
  // 静态方法,能被子类继承,但是不能被实例化对象继承。
  static greeting(){
    console.log("静态方法")
  }
}
// 静态属性
A.age=22;

class B extends A {
  constructor(){
    super();
  }
  bsay(){
    // p是实例的属性,通过this访问
      console.log(this.p) //1
    // 在普通方法中,super指向的是父类原型对象,即prototype,
    // 所以能访问父类原型上的方法。
    super.say() // "普通方法";
  }
  static bgreeting(){
    // 在静态方法中,super指向的是父类,能访问父类的静态属性和静态方法。
    super.greeting(); //"静态方法"
    console.log(super.age); //22
  }
}

let xiao = new B();
xiao.bsay();
B.bgreeting(); 

要点总结:

类的 prototype 属性和proto属性

类同时有prototype属性和__proto__属性,因此同时存在两条继承链。
例子:

class Par{
    constructor(){
        // ....
    }
    say(){
        console.log("我今年"+this.age+"岁了!")
    }
    static greeting(){
        console.log("hello")
    }
}
Par.num=101;
class  Chil  extends Par{
    constructor(){
        super()
    }
}
console.dir(Chil)

原生构造函数继承

class MyArray extends Array {
  constructor(...args) {
    super(...args);
  }
}

var arr = new MyArray();
arr[0] = 12;
arr.length // 1

arr.length = 0;
arr[0] // undefined
上一篇 下一篇

猜你喜欢

热点阅读