前言
JS有好几种继承方式,常见的就是原型链继承和call改变指向
先看原型链是怎么回事,一图胜千言
ES5的寄生组合继承
1 | function parent (age) { |
class继承
1 | // 转换前 |
1 | // 转换后 |
class extend原理
1 | // 转换前 |
1 | // 转换后 |
_inherits核心思想就是下面两句
1 | subClass.prototype.__proto__ = superClass.prototype |
首先 subClass.prototype.__proto__ = superClass.prototype保证了c instanceof Parent是true,Child的实例可以访问到父类的属性,包括内部属性,以及原型属性。其次,subClass.__proto__ = superClass,保证了Child.height也能访问到,也就是静态方法。
subClass.__proto__ = superClass不是很好理解,可以通过下面的方式理解
1 | function A(){} |
区别
ES5 的继承,实质是先创造子类的实例对象this,然后再将父类的方法添加到this上面(Parent.apply(this))。
ES6 的继承机制完全不同,实质是先将父类实例对象的属性和方法,加到this上面(所以必须先调用super方法),然后再用子类的构造函数修改this。