ES5/ES6 的继承除了写法以外还有什么区别


es5继承

构造函数、原型和实例的关系:每一个构造函数都有一个原型对象,每一个原型对象都有一个指向构造函数的指针,而每一个实例都包含一个指向原型对象的内部指针。

1.原型链实现的继承


2.借用构造函数


3.组合继承


4.原型式继承


5.寄生式继承


6.寄生组合式继承

以上的继承方法看红宝书



ES5的继承

es6继承

class继承,class之间使用extends关键字

子类必须要再constructor方法中调用super方法,否则新建实例会报错,这是因为子类没有自己的this对象,而是继承父类的this对象,然后对其进行加工,如果不调用super方法,子类就得不到this对象。

prototype 和 __proto__

一个继承语句同时存在于两条继承链:一条继承属性,一条实现方法的继承

1 class A extends B{}

2 A.__proto__ === B;//继承属性

3 A.prototype.__proto__ == B.prototype;//继承方法


区别:ES5的继承实质上是先创建子类的实例对象,然后再将父类的方法添加到this上(Parent.apply(this)).

ES6的继承机制完全不同,实质上是先创建父类的实例对象this(所以必须先调用父类的super()方法),然后再用子类的构造函数修改this。

ES5的继承时通过原型或构造函数机制来实现。

ES6通过class关键字定义类,里面有构造方法,类之间通过extends关键字实现继承。子类必须在constructor方法中调用super方法,否则新建实例报错。因为子类没有自己的this对象,而是继承了父类的this对象,然后对其进行加工。如果不调用super方法,子类得不到this对象。

注意super关键字指代父类的实例,即父类的this对象。

注意:在子类构造函数中,调用super后,才可使用this关键字,否则报错。

你可能感兴趣的:(ES5/ES6 的继承除了写法以外还有什么区别)