组合继承,即组合构造函数继承和原型链继承方式,使用构造函数继承方式继承实例属性,即非共享属性;使用原型链继承方式继承共享的属性和方法。
<script>
/**父类型构造函数,定义实例属性**/
function SuperType(name) {
/**必须添加this关键字,因为下面子类型继承是通过call方法,在子类型的作用范围调用父类构造函数的,如果不指定this
*关键字,则不能被子类型继承,并且会报×× is not defined 的错误
**/
this.name = name;
this.colors = ["red", "blue", "green"];
this.show = function(){
console.log("colors:" + this.colors);
}
}
/**父类型原型对象中的方法**/
SuperType.prototype.sayName = function(){
console.log(this.name);
}
/**子类型构造函数**/
function SubType(name,age) {
SuperType.call(this,name);//构造函数,继承父类型中的属性,并且不与其他类型共享
this.age = age;//自己新创建的实例属性
}
/**将父类型的实例赋值给子类型的原型对象,父类型实例中的两个实例属性此时会变成子类型的原型对象,但是因为子类型的构
*造函数内部调用了父类型的构造函数,所以子类型中也有自己的实例属性了,也即,子类型中有两组name和colors,一组是自
*父类型实例中的属性,作为子类型的原型属性;一组是子类型通过调用父类型构造函数定义的自己的实例属性
**/
SubType.prototype = new SuperType();
/**在子类型中定义共享方法**/
SubType.prototype.sayAge = function(){
console.log(this.age);
}
var ins1 = new SubType("Nicholars",29);
ins1.colors.push("black");
console.log(ins1.colors);//["red", "blue", "green", "black"]
ins1.sayName();//Nicholars
ins1.sayAge();//29
ins1.show();//colors:red,blue,green,black
delete ins1.colors;//删除掉了子类型实例中的实例属性,则原型中的原型属性就会发挥作用
console.log(ins1.colors);//["red", "blue", "green"]
var ins2 = new SubType("Greg",27);
console.log(ins2.colors);//["red", "blue", "green"]
ins2.sayName();//Greg
ins2.sayAge();//27
ins2.show();//colors:red,blue,green
console.log(ins1.sayName == ins2.sayName);//首先,在各自内部查找实例方法,没有,找原型方法,还是没有,去父类找原型方法
</script>
原文:https://www.cnblogs.com/qingyaxuan/p/9068494.html