1.代码如下:
function SuperType(name){
this.name =name;
this.colors = ["red","blue","green"];
this.sex = "man"
}
SuperType.prototype.sayName = function(){
alert(this.name);
};
function SubType(name,age){
//1.继承属性
SuperType.call(this,name);
this.age = age ;
}
//2.继承方法
SubType.prototype = new SuperType();
SubType.prototype.constructor = SubType;
SubType.prototype.sayAge = function(){
alert(this.age);
};
var instance1 = new SubType("Nichloas",29);
instance1.colors.push("black");
alert(instance1.colors);
alert(instance1.sex);
instance1.sayName();
instance1.sayAge();
var instance2 = new SubType("Greg",27);
alert(instance2.colors);
instance2.sayName();
instance2.sayAge();
2书上这句SubType.prototype = new SuperType();SubType.prototype.constructor = SubType代码的疑问,我是这样想的:这个SuperType的实例赋值给SubType的原型,不是意味着SubType的原型对象中constructor属性指向SuperType,那么他设SubType.prototype.constructor = SubType,不是把constructor重新指向SubType,这样,SuperType的方法还能被继承吗?SubType.prototype.constructor = SubType这句什么意思?
1)原型是属于一个函数对象的
2)原型是一个对象
3)以一个原型具有constructor属性,指向一个函数对象
4)在默认情况下,一个函数对象的原型的contructor属性指向这个函数对象,当然后有非默认情况的
问题中描述了默认和非默认的
默认的:
SuperType.prototype.constructor指向默认的SuperType函数对象;
非默认的:
上面2)有提到,prototype是指向一个对象的,那么也就意味着我可以直接赋一个对象给prototype属性
就是如此-SubType通过原型链就“继承”了SuperType的prototype中定义的方法及SuperType实例方法及属性
此时的SubType.prototype.constructor就
指向SuperType的实例对象的constructor,这个值就是SuperType函数
如果继承代码到此为止的话,带来的一个问题就是SubType不能正确地反应其真实地constructor
SubType是SubType构造函数的实例,但是SubType原型的构造函数却是SuperType,这个就和原型"继承"的设计语义相违背了。
这个问题可以通过重新设置constructor来解决
SubType原型的构造器对象指向了SubType
各归其位,各司其职