1、原型链继承
1 | function Parent() { |
缺点:引用类型的属性被所有实例共享
问题: 而且还存在一个问题:我们在创建Child实例时,不能像Parent传参
2、构造函数继承(经典继承)
1 | function Parent(name) { |
优点:
1、避免了引用类型的属性被所有实例共享
2、可以在Child中向Parent传参
缺点:访问不到父类中的方法
3、组合继承
1 | function Parent(name) { |
缺点:每创建一个child时都会调用Parent.call
和new Parent()
,会调用两次父构造函数
一次是设置子类型实例的原型的时候
1
Child.prototype = new Parent()
一次在创建子类型实例的时候
1
var child1 = new Child('kevin', '18');
回想下 new 的模拟实现,其实在这句中,我们会执行:
1
Parent.call(this, name);
在这里,我们又会调用了一次 Parent 构造函数。
4、寄生式组合继承
1 | function Parent(name) { |
缺点:因为Child.prototype = Parent.prototype
指向同一个对象,所以子类改变了该对象,相应的的父类也会改变
解决: 拷贝一份Parent.prototype
5、寄生式组合继承(优化)
1 | function Parent(name) { |