论坛首页 Web前端技术论坛

类继承上的严重问题

浏览 5924 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2006-12-31  
在类继承上遇到了很郁闷的问题,例子如下:

<script>
function Parent(name,age){
     alert('Parent:'+name);
     this.name = name;
     this.age = age;
}

Parent.prototype.getAge = function(){
      return parseFloat(this.age) - 1;
}

Child.prototype = new Parent;
function Child(name, profession, age){
      var args = [name, age];
      Parent.apply(this, args);
}

Child.prototype.getAge = function(){
      var age = Parent.prototype.getAge.apply(this, arguments);
      return this.name + '--' + age;
}

var c = new Child('linxf', 'programmer', 25);
alert(c.name); 
alert(c.getAge());

</script>


我写了两个类,父类Parent,子类Child

继承方法:Parent.apply(this, args);     -用这个的原因是因为我想让父类的属性能被子类继承。
         Child.prototype = new Parent;  -用这个的原因是因为我在子类的getAge方法里要先调用父类的getAge方法。

如果用Child.prototype = Parent.prototype; 子类里就没办法先调用父类的getAge方法再进行自己的处理了。因为这时候Parent.prototype.getAge就是子类的getAge,会造成递归调用。

结果是打印
Parent: undefined    ---打印这个的原因是因为Child.prototype = new Parent;
          linxf  --从父类继承下来的属性
          linxf-24  --调用子类的getAge方法取得的返回值

这看上去好像没什么,可是我有几个控件就是按这样的继承关系写的。因为在Child.prototype = new Parent;的时候就执行了父类的构造函数,可是这个时候
并没有取得父类传进来的参数,再往下做一些动作的时候就出错了(比如我通过传进来的name取页面上的对象再取值)。

有没有其它的办法实现继承可以绕开这样的错误?谢谢。
   发表时间:2006-12-31  
目的是什么?让Parent: undefined不出来?
比较靠谱的办法是把alert挪到构造函数外面,我猜
0 请登录后投票
   发表时间:2007-01-02  
Prototype里面不是有个Class.extend的方法么,你这样继承肯定会调用Parent这个方法的,这个是JS的特性,没有办法啦。
Prototype里面这个方法,我想就是为这个解决这个问题的吧。我想。
0 请登录后投票
   发表时间:2007-01-04  
可以用一个简单的方法绕过这类错误。将楼主中子类的构造方法修改一下即可。
本来的代码:

Child.prototype = new Parent;  
function Child(name, profession, age){  
      var args = [name, age];  
      Parent.apply(this, args);  
}


修改为:
function Child(name, profession, age){  
       	this.base = Parent;
		this.base(name,age);
 } 


注意,这个方法并不使用prototype来实现继承。 
0 请登录后投票
   发表时间:2007-01-17  
楼上的朋友,你写的那样还是不行。如果我在Parent里面加一个方法:
Parent.prototype.getHobbit = function(){  
return 'hobbit from parent';
}

我没办法用c.getHobbit();
0 请登录后投票
   发表时间:2007-01-17  
以前没有注意到这个问题咧,因为这个想起我上一次写的那个项目,最后因为时间赶,也是这个问题,竟然将一些类改成在构造函数中只保存数据...

一个变通:

 
  1. function Parent(arg1,arg2 ...){  
  2.   if ((!arguments) || (!arguments.length)){  
  3.     return;  
  4.   }  
  5.   
  6.   //do something ...  
  7. }  
0 请登录后投票
   发表时间:2007-01-17  
我运行了你的代码,输出的结果不是你写的那样,而是:
Parent:undefined 
Parent:linxf 
linxf 
linxf--24


是不是可以忽略Child.prototype = new Parent;这个parent的构造过程,或者在Parent中做判断,比如没有参数的时候还是保持内部的属性是初始状态。这样你只要保证你在Child的定义中一定要对Parent.apply一下就行了吧。

另外Class.extend怎么用?我学习一下。
0 请登录后投票
   发表时间:2007-01-17  
AnyRock 写道

另外Class.extend怎么用?我学习一下。


就是简单的属性拷贝,对解决楼主的问题没什么帮助。
0 请登录后投票
   发表时间:2007-01-17  
netfishx,我想复杂的了解一下这个“简单的属性拷贝"....
0 请登录后投票
   发表时间:2007-01-17  
看代码就明白了,确实没什么复杂的:
Object.extend = function(destination, source) {
  for (var property in source) {
    destination[property] = source[property];
  }
  return destination;
}
0 请登录后投票
论坛首页 Web前端技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics