实质是先创造子类的实例对象 this,然后再将父类的方法添加到 this 上面(Parent.apply(this))
ES6 的继承
先创建父类实例 this 通过 class、extends、super 关键字定义子类,并改变 this 指向, super 本身是指向父类的构造函数但做函数调用后返回的是子类的实例, 实际上做了父类.prototype.constructor.call(this), 做对象调用时指向父类.prototype,从而实现继承。
//ES5
function Super() {}
function Sub() {}
Sub.prototype = new Super();
Sub.prototype.constructor = Sub;
var sub = new Sub();
Sub.prototype.constructor === Sub; // ② true
sub.constructor === Sub; // ④ true
sub.__proto__ === Sub.prototype; // ⑤ true
Sub.prototype.__proto__ == Super.prototype; // ⑦ true
// ES6
class Super {}
class Sub extends Super {}
var sub = new Sub();
Sub.prototype.constructor === Sub; // ② true
sub.constructor === Sub; // ④ true
sub.__proto__ === Sub.prototype; // ⑤ true
Sub.__proto__ === Super; // ⑥ true
Sub.prototype.__proto__ === Super.prototype; // ⑦ true