猿问

关于组合继承方式的理解问题

代码摘自于高程3面向对象一章。由于本人嘴笨,将问题写在了以下代码中。自己愚笨,还望知点解答,谢谢!
functionSuperType(name){
this.name=name;
this.colors=['red','blue','green']
}
SuperType.prototype.sayName=function(){
alert(this.name)
}
//----以上是构造行数
functionSubType(name,age){
SuperType.call(this,name)//这里利用了借用构造函数将SuperType的属性继承过来(借用构造函数只能获得构造函数属性,无法获得构造函数方法)
this.age=age//只属于SubType的属性
}
//----以上普通函数SubType,其中借用了构造函数SuperType的属性(this.name、this.colors)
SubType.prototype=newSuperType()
//----SubType的原型通过原型链继承自构造函数SuperType(SuperType.prototype,也就是sayName方法)
SubType.prototype.constructor=SubType
//----由于重写了SubType的原型,所以需要重新定义constructor=SubType
SubType.prototype.sayAge=function(){
alert(this.age)
}
//----问题1在这里:
//----由于SubType.prototype是实例化构造函SuperType(原型链继承了构造函数SuperType的方法sayName)
//----那么为SubType的原型追加了sayAge方法,是否SuperType.prototype也会相应增加sayAge方法?如果是的话下方代码instance2.colors中为何没有black
varinstance1=newSubType('Nicholas',29)
//----问题2在这里:
//----由于SubType.prototype=newSuperType(),SubType.prototype会修改构造函数的原型
//----这里instance1是SubType的实例,那么instance1是否也会随原型链,指向SuperType()的原型?
instance1.colors.push('black')
alert(instance1.colors)//red,blue,green,black
instance1.sayName()//'Nicholas'
instance1.sayAge()//29
varinstance2=newSubType('Greg',27)
alert(instance2.colors)//red,blue,green
instance2.sayName()//'Greg'
instance2.sayAge()//27
综上所述,感觉根源还是自己并没有太理解这种组合方式,是如何同时兼顾原型方法共享又同时存在自身属性
肥皂起泡泡
浏览 268回答 2
2回答
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答