# 继承方式的区别
# 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的继承最大的区别在于:
- ES5是先创建子类,再实例化父类,通过原型链和构造函数的方式添加到子类this中
- ES6是先创建了父类,在实例化子集的过程中,通过调用super方法访问父级后,再通过修改this实现继承。