js

ES5和ES6继承

2020-04-09  本文已影响0人  书虫和泰迪熊

ES5继承

es的继承实现方式有好多种:(上篇文章说过啦:https://www.jianshu.com/p/c053e810b588

  1. 原型链继承
  2. 构造函数继承
  3. 组合继承
  4. 原型式继承
  5. 寄生继承
  6. 寄生组合式继承

ES6继承

使用class关键字直接定义类,加大括号,构造函数使用 constructor ,继承使用 extends 关键字。
一个简单的例子

class ColorPoint extends Point {
  constructor(x, y, color) {
    super(x, y); // 调用父类的constructor(x, y)
    this.color = color;
  }

  toString() {
    return this.color + ' ' + super.toString(); // 调用父类的toString()
  }
}
  1. 子类必须在constructor方法中调用super方法,否则新建实例时会报错。
    因为子类自己的this对象,必须先通过父类的构造函数完成塑造,得到与父类同样的实例属性和方法,然后再对其进行加工,加上子类自己的实例属性和方法。如果不调用super方法,子类就得不到this对象

  1. 当函数使用是: super虽然代表了父类A的构造函数,但是返回的是子类B的实例,即super内部的this指的是B,因此super()在这里相当于 A.prototype.constructor.call(this,prop); super()只能用在子类的构造函数之中,用在其他地方就会报错。
  2. 当对象使用: 在普通方法中,指向父类的原型对象;在静态方法中,指向父类。 所以在子类的方法中super.print();指向的是父类原型上的方法。
    但是因为super的两种用法,所以es6规定在使用必须要明确使用方式,像单独console.log(super) 就会报错。

  1. constructor 方法是类的构造函数,是一个默认方法,通过 new 命令创建对象实例时,自动调用该方法。一个类必须有 constructor 方法,如果没有显式定义,一个默认的 consructor 方法会被默认添加。所以即使你没有添加构造函数,也是会有一个默认的构造函数的。一般 constructor 方法返回实例对象 this ,但是也可以指定 constructor 方法返回一个全新的对象,让返回的实例对象不是该类的实例。

class A {
}

class B extends A {
}

B.__proto__ === A    // true  继承属性
B.prototype.__proto__ === A.prototype   //true  继承方法
上一篇 下一篇

猜你喜欢

热点阅读