对象继承——组合继承
组合继承,即组合构造函数继承和原型链继承方式,使用构造函数继承方式继承实例属性,即非共享属性;使用原型链继承方式继承共享的属性和方法。
<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>