1.原型链
1) 例子,继承关系如图所示

2) 确定原型和实例的关系
- 使用
instanceof操作符:只要构造函数在原型中出现过,就会返回true isPrototypeOf():只要是原型链上出现过的原型,都可以说是改原型链所派生的实例的原型
3) 原型链存在的问题
- 在超类型的构造函数中定义的属性,会变成子类型的原型对象上的属性(原型对象上的属性会被所有实例共享)
- 创建子类型时,不能向超类型的构造函数中传递参数
2.借用构造函数
1) 例子,继承关系如图所示

2)借用构造函数实现继承的优势:可以像超类型的构造函数传递参数
3)存在的问题:无法共享方法
3.组合继承
1) 例子,继承关系如图所示

2) 优点:避免了原型链和借用构造函数的缺陷
3) 缺点:会调用两次超类的构造函数,给子类型的原型对象添加了有多余的属性
4.原型式继承
1) 思路:基于已有的对象创建新对象

2) ES5中的Object.create(obj, properties)方法实现了这种继承方法
5.寄生式继承
1) 思路:创建一个仅用于封装继承过程的函数,该函数在内部以某种方式来增强对象,最后返回对象

6.寄生组合式继承
1) 解决的问题:解决组合式继承会调用两次超类构造函数的问题
2) 思路:通过借用构造函数来继承属性,通过寄生式继承来继承方法
3) 例子,继承逻辑如图所示
