快速回顾七个继承~

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也会被默认添加constructorsuper
  • 如果没有省略constructorsuper也不能省略(只有调用super之后,才可以使用this关键字,否则会报错)
  • 静态方法:如果在一个方法前,加上static关键字,就表示该方法不会被实例继承,而是直接通过类来调用
  • super在静态方法之中指向父类,在普通方法之中指向父类的原型对象。
  • class继承也有getter/setter拦截机制
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享