继承的实现方式之 原型链

原型链实现继承

基本模式

function SuperType(){
    this.property = true;
}
SuperType.prototype.getSuperValue = function(){
    console.log(this);
    return this.property;
}

function SubType(){
    this.subproperty = false;
}
SubType.prototype = new SuperType();
//这一步和上一步不可以调换顺序,否则getSubValue会被新的supertype实例覆盖
SubType.prototype.getSubValue = function(){
    return this.subproperty;
}

let instance = new SubType();
console.log(instance.getSuperValue());

 

过程图示

1. 

function SuperType(){
    this.property = true;
}
SuperType.prototype.getSuperValue = function(){
    console.log(this);
    return this.property;
}

function SubType(){
    this.subproperty = false;
}

创建子类父类构造函数,各自自动生成默认的prototype。其中SuperType的原型上添加了方法getSuperValue。

 

2. 

SubType.prototype = new SuperType();
new SuperType() 实现的效果:


SubType.prototype = new SuperType();将上一步中默认生成的 SubType.prototype 用一个SuperType的实例覆盖:

 

  


 3. 

SubType.prototype.getSubValue = function(){
    return this.subproperty;
}

为新的prototype添加一个方法:

 

问题

  1. 原本在父类上属于实例的属性在继承后变成了子类的原型属性
  2. 创建subtype实例时,无法在向SuperType的构造函数传参,从supertype继承来的属性值不能自定
  3. 对继承来的引用类型的属性,在任一个实例上做的修改会体现在所有实例上

 

posted @ 2020-07-15 05:37  studystudyxinxin  阅读(201)  评论(0编辑  收藏  举报