1.原型链继承
核心代码
Child.prototype = new Parent()
复制代码
优点:
- 继承了父类和父类的原型对象(继承了父亲和祖宗)
缺点:
- 来自原型对象的所有属性都被共享,如果修改了原型对象中的引用类型,那么所有子类创建的实例对象都会受到影响
- 创建子类时,无法向父类构造函数传参数
2.构造继承
核心代码
function Parent (name) {
this.name = name
}
function Child () {
Parent.call(this, ...arguments) // 核心代码
}
var child1 = new Child('child')
复制代码
优点:
- 解决了原型链继承中子类实例共享父类引用对象的问题
- 创建子类实例时,可以向父类传递参数
缺点:
- 只能继承父类的实例属性和方法,不能继承父类原型的属性和方法(只能继承父亲,不能继承祖宗)
- 每个子类都有父类实例函数的副本,无法复用,影响性能(有的方法完全没有必要复制,可以用来共用的)
3.组合继承(原型链+构造)
核心代码
function Parent (name) {
this.name = name
}
// 原型链继承
Child.prototype = new Parent()
// 构造继承
function Child () {
Parent.call(this, ...arguments)
}
// 修复constructor指向
Child.prototype.constructor = Child
复制代码
优点:
- 继承了父类和父类的原型对象(继承了父亲和祖宗)(原型链继承的优点、弥补了构造继承的缺点)
- 创建子类实例时,可以向父类传递参数(构造继承的优点)
- 弥补了原型链继承中引用属性共享的问题(弥补了原型链继承的缺点)
缺点:
-
父类构造函数会被调用两次,并且生成了两个实例,子类实例中的属性和方法会覆盖子类原型(父类实例)上的属性和方法,所以增加了不必要的内存。
4.原型式继承
核心代码
Object.create()
复制代码
缺点:
- 继承实例的引用数据类会被公用
- 无法直接给父级构造函数传参
5.寄生式继承
核心代码
child = Object.create(parent);
child.fn = function () 增强对象,添加定制属性
复制代码
缺点:
- 两个实例会公用继承实例的引用数据类
- 无法直接给父级构造函数传参
6.寄生组合继承
核心代码
function Parent (name) {
this.name = name
}
// 构造继承
function Child () {
Parent.call(this, ...arguments)
}
// 与组合继承的区别
Child.prototype = Object.create(Parent.prototype)
// 修复constructor指向
Child.prototype.constructor = Child
复制代码
优点:完美
7. ES6继承
要点:
extends默认实现继承父类的所有属性和方法,哪怕省略了constructor也会被默认添加constructor和super- 如果没有省略
constructor,super也不能省略(只有调用super之后,才可以使用this关键字,否则会报错) - 静态方法:如果在一个方法前,加上static关键字,就表示该方法不会被实例继承,而是直接通过类来调用
super在静态方法之中指向父类,在普通方法之中指向父类的原型对象。class继承也有getter/setter拦截机制
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END






















![[桜井宁宁]COS和泉纱雾超可爱写真福利集-一一网](https://www.proyy.com/skycj/data/images/2020-12-13/4d3cf227a85d7e79f5d6b4efb6bde3e8.jpg)

![[桜井宁宁] 爆乳奶牛少女cos写真-一一网](https://www.proyy.com/skycj/data/images/2020-12-13/d40483e126fcf567894e89c65eaca655.jpg)