继承
常见的继承方式有 原型继承、组合继承、寄生组合继承、类的继承
①原型继承:它的原理就是,利用原型链继承父级构造函数 ,从而继承原型上的方法------语法: 子构造函数.prototype = new 父构造函数()
步骤:
定义父级构造函数------>定义子级构造函数------>通过 '子构造函数.prototype = new 父构造函数()' 的方式将父构造函数的属性和方法继承到子构造函数的原型上------>将子构造函数实例化------>可以直接通过字构造函数实例.属性/方法的形式使用

②组合继承:指的是将原型链 和 借用构造函数 call 技术组合到一块,从而发挥二者之长的一种继承模式,其背后的思路: 是使用原型链实现对原型属性和方法的继承 (主要是方法),而通过借用构造函数来实现对实例属性的继承。这样既通过在原型上定义方法实现了函数复用,又能保证每个实例都有它的自己的属性。
步骤:
定义父级构造函数------>定义子级构造函数------>通过在子级构造函数中使用父级构造函数.call的方式实现属性的继承------>通过 '子构造函数.prototype = new 父构造函数()' 的方式将父构造函数的方法继承到子构造函数的原型上------>将子构造函数实例化------>可以直接通过字构造函数实例.属性/方法的形式使用

③寄生组合继承:利用Object.create(参数对象),
1. Object.create 会创建一个新对象
2. 并且这个新对象的 __proto__ 会指向传入的参数对象,所以这个参数对象的值就是父级构造函数
与组合继承的不同之处就是在于这次给子级构造函数.prototype赋的值从父级构造函数实例变成了 Object.create (父级构造函数.prototype)

④类的继承------extends关键字
步骤:
定义父类------>通过extends关键字继承父类数字属性和方法------>在子类构造函数中通过super关键字即可访问使用父类的属性方法------>最后将子类进行实例化,这时的子类构造函数就可以直接通过实例.属性/方法的形式进行访问
