继承的实现方式之 原型链
原型链实现继承
基本模式
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添加一个方法:
问题
- 原本在父类上属于实例的属性在继承后变成了子类的原型属性
- 创建subtype实例时,无法在向SuperType的构造函数传参,从supertype继承来的属性值不能自定
- 对继承来的引用类型的属性,在任一个实例上做的修改会体现在所有实例上