文章 2020-08-17-寄生组合式继承
Post
Cancel

2020-08-17-寄生组合式继承

js中给对象赋值的方式有两种

1
2
3
4
5
6
// 1. 执行构造函数赋值
function A() {
	this.a = 1
}
// 2 通过原型设置属性
A.prototype.b = 1

寄生组合式继承实质是 组合继承+寄生继承
而组合继承又是由原型链继承+构造函数继承

  1. 原型链继承 子类的原型指向父类的实例实现原型继承。 原型链继承的好处是可以实现所有属性及方法的共享,但不能属性、方法独享。也就是sub1修改了父类的方法,sub2就无使用旧函数
  2. 构造函数继承 通过call apply实现子类调用父类的属性及方法 缺点:所有属性方法独享但无法做到属性、方法共享。如sub1增加一个方法,sub2想用需要在sub2中增加同样的方法
  3. 组合继承 将1和2结合起来。共享属性、方法通过原型链继承。独享的属性通过构造函数实现。 缺点:实现的时候调用两次父类。造成内存、性能浪费
  4. 寄生继承 不通过实例化父类,直接实例化父类副本实现原型链继承。也就是子类的原型执行父类副本实例实现原型继承
  5. 寄生组合式继承 以上四中组合继承结合
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);

This post is licensed under CC BY 4.0 by the author.