# 继承方式的区别

# ES5的继承

ES5的继承,是先创造子类的实例对象this,然后再将父类的方法或者属性添加到this上

接着才进行原型链的继承和构造函数的调整。

function Person(/*...*/){
	//...
};
Person.prototype.drink = function(){
	//...
};
function Student(/*...*/){
    Person.call(/*...*/);
    // call方法调用父类构造函数
    //...
};
Student.prototype = Object.create(Person.prototype);
// 继承父类原型
Student.prototype.constructor = Student
// 构造函数调整

# ES6的继承

ES6的继承,ES6引入了类的概念,也就是class,可以通过关键字class去定义对象。

class是关键字、语法糖,通过属性constructor来接收控制方法传入的参数,若不写该属性,默认没有参数。

ES6中的继承是基于class类之间继承的,通过关键词extends实现。

先调用super方法实例化调用父类,将父类实例对象的属性和方法加到tis上面,然后采用子类构造函数修改this。

且,在子类中,只有先使用super方法之后,才可以使用this关键字

class Person{
	constructor(/* ... */){
	//...
	}
	//...
};
class Student extends Person{
	constructor(/* ... */){
        // super实例化父类
		super(/* ... */);
		//...
	}
}

# 对比

ES5和ES6的继承最大的区别在于:

  1. ES5是先创建子类,再实例化父类,通过原型链和构造函数的方式添加到子类this中
  2. ES6是先创建了父类,在实例化子集的过程中,通过调用super方法访问父级后,再通过修改this实现继承。
更新时间: 6/24/2021, 8:05:43 PM