js中给对象赋值的方式有两种
1
2
3
4
5
6
// 1. 执行构造函数赋值
function A() {
this.a = 1
}
// 2 通过原型设置属性
A.prototype.b = 1
寄生组合式继承实质是 组合继承+寄生继承
而组合继承又是由原型链继承+构造函数继承
- 原型链继承 子类的原型指向父类的实例实现原型继承。 原型链继承的好处是可以实现所有属性及方法的共享,但不能属性、方法独享。也就是sub1修改了父类的方法,sub2就无使用旧函数
- 构造函数继承 通过call apply实现子类调用父类的属性及方法 缺点:所有属性方法独享但无法做到属性、方法共享。如sub1增加一个方法,sub2想用需要在sub2中增加同样的方法
- 组合继承 将1和2结合起来。共享属性、方法通过原型链继承。独享的属性通过构造函数实现。 缺点:实现的时候调用两次父类。造成内存、性能浪费
- 寄生继承 不通过实例化父类,直接实例化父类副本实现原型链继承。也就是子类的原型执行父类副本实例实现原型继承
- 寄生组合式继承 以上四中组合继承结合
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
function SuperType(name,colors){
this.name=name;
this.colors=colors;
}
SuperType.prototype.getSuperProperty=function(){ return this.name; }
function SubType(job,name,colors){
SuperType.call(this,name,colors);
this.job=job;
}
SubType.prototype.getSubPrototype=function(){ return this.job; }
function inherit(subType,superType){
var prototype=Object.create(superType.prototype);
prototype.constructor=subType;
subType.prototype=prototype;
}
inherit(SubType,SuperType);
var instance=new SubType("doctor","John",["red","green"]);
console.log(instance.getSubPrototype()); //输出"doctor"
console.log(instance.getSuperProperty()); //输出"John",成功调用在父类原型定义的方法
属性继承代码是SuperType.call(this,name,colors);
原型继承代码是inherit(SubType,SuperType);