继承是面向对象编程中又一非常重要的概念,JavaScript支持实现继承,不支持接口继承,实现继承主要依靠原型链来实现的。
原型链
首先得要明白什么是原型链,昆明北大青鸟http://www.kmbdqn.cn/建议可以在一篇文章看懂proto和prototype的关系及区别中讲得非常详细
原型链继承基本思想就是让一个原型对象指向另一个类型的实例
添加方法
在给SubType原型添加方法的时候,如果,父类上也有同样的名字,SubType将会覆盖这个方法,达到重新的目的。但是这个方法依然存在于父类中。
记住不能以字面量的形式添加,因为,上面说过通过实例继承本质上就是重写,再使用字面量形式,又是一次重写了,但这次重写没有跟父类有任何关联,所以就会导致原型链截断。
问题
单纯的使用原型链继承,主要问题来自包含引用类型值的原型。
借用构造函数
此方法为了解决原型中包含引用类型值所带来的问题。
这种方法的思想就是在子类构造函数的内部调用父类构造函数,可以借助apply()和call()方法来改变对象的执行上下文
传递参数
借助构造函数还有一个优势就是可以传递参数
1.每个构造函数都有一个原型对象
2.每个原型对象都包含一个指向构造函数的指针
3.每个实例都包含一个指向原型对象的指针
4.查找方式是一层层向上查找直至顶层Object.prototype
1.原型链继承
2.借用构造函数(call,apply)
3.组合继承(原型链+构造函数)
4.原型式继承
5.寄生式组合式继承
每一种继承的方式都有自己的优缺点
组合继承的特点是会调用构造函数两次,
都是将多种继承方式组合到一起相辅相成.
1.创建一个空的对象
2.将空的对象的proto成员指向构造函数的prototype成员对象
3.调用构造函数将this指向前面创建的对象