3.实例继承法例子
在说此法例子之前,说说构造继承法的局限,如下:
functionMyDate()
{
this.base=Date;
this.base.apply(this,arguments);
}
vardate=newMyDate();
alert(date.toGMTString);//undefined,date并没有继承到Date类型,所以没有toGMTString方法
{
this.base=Date;
this.base.apply(this,arguments);
}
vardate=newMyDate();
alert(date.toGMTString);//undefined,date并没有继承到Date类型,所以没有toGMTString方法
核心对象的某些方法不能被构造继承,原因是核心对象并不像我们自定义的一般对象那样在构造函数里进行赋值或初始化操作换成原型继承法呢?,如下:
functionMyDate(){}
MyDate.prototype=newDate();
vardate=newMyDate();
MyDate.prototype=newDate();
vardate=newMyDate();
alert(date.toGMTString);//'[object]'不是日期对象,仍然没有继承到Date类型!
现在,换成实例继承法:
functionMyDate()
{
varinstance=newDate();//instance是一个新创建的日期对象
instance.printDate=function(){
document.write("<p>"+instance.toLocaleString()+"</p>");
}//对instance扩展printDate()方法 returninstance;//将instance作为构造函数的返回值返回
}
varmyDate=newMyDate();
dwn(myDate.toGMTString());//这回成功输出了正确的时间字符串,看来myDate已经是一个Date的实例了,继承成功 myDate.printDate();//如果没有returninstance,将不能以下标访问,因为是私有对象的方法
{
varinstance=newDate();//instance是一个新创建的日期对象
instance.printDate=function(){
document.write("<p>"+instance.toLocaleString()+"</p>");
}//对instance扩展printDate()方法 returninstance;//将instance作为构造函数的返回值返回
}
varmyDate=newMyDate();
dwn(myDate.toGMTString());//这回成功输出了正确的时间字符串,看来myDate已经是一个Date的实例了,继承成功 myDate.printDate();//如果没有returninstance,将不能以下标访问,因为是私有对象的方法
4,拷贝继承法例子
Function.prototype.extends=function(obj)
{
for(vareachinobj)
{
this.prototype[each]=obj[each];
//对对象的属性进行一对一的复制,但是它又慢又容易引起问题
//所以这种“继承”方式一般不推荐使用
}
}
varPoint2D=function(){ //…… }
Point2D.extends(newPoint()) { //…… }
{
for(vareachinobj)
{
this.prototype[each]=obj[each];
//对对象的属性进行一对一的复制,但是它又慢又容易引起问题
//所以这种“继承”方式一般不推荐使用
}
}
varPoint2D=function(){ //…… }
Point2D.extends(newPoint()) { //…… }
这种继承法似乎是用得很少的。
5,混合继承例子
functionPoint2D(x,y)
{
this.x=x;
this.y=y;
}
functionColorPoint2D(x,y,c)
{
Point2D.call(this,x,y);//这里是构造继承,调用了父类的构造函数
//从前面的例子看过来,这里等价于
//this.base=Point2D;
//this.base.call(this,x,y);
this.color=c;
}
ColorPoint2D.prototype=newPoint2D();//这里用了原型继承,让ColorPoint2D以Point2D对象为原型
{
this.x=x;
this.y=y;
}
functionColorPoint2D(x,y,c)
{
Point2D.call(this,x,y);//这里是构造继承,调用了父类的构造函数
//从前面的例子看过来,这里等价于
//this.base=Point2D;
//this.base.call(this,x,y);
this.color=c;
}
ColorPoint2D.prototype=newPoint2D();//这里用了原型继承,让ColorPoint2D以Point2D对象为原型