锁定老帖子 主题:类继承上的严重问题
精华帖 (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取页面上的对象再取值)。 有没有其它的办法实现继承可以绕开这样的错误?谢谢。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2006-12-31
目的是什么?让Parent: undefined不出来?
比较靠谱的办法是把alert挪到构造函数外面,我猜 |
|
返回顶楼 | |
发表时间:2007-01-02
Prototype里面不是有个Class.extend的方法么,你这样继承肯定会调用Parent这个方法的,这个是JS的特性,没有办法啦。
Prototype里面这个方法,我想就是为这个解决这个问题的吧。我想。 |
|
返回顶楼 | |
发表时间: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来实现继承。 |
|
返回顶楼 | |
发表时间:2007-01-17
楼上的朋友,你写的那样还是不行。如果我在Parent里面加一个方法:
Parent.prototype.getHobbit = function(){ return 'hobbit from parent'; } 我没办法用c.getHobbit(); |
|
返回顶楼 | |
发表时间:2007-01-17
以前没有注意到这个问题咧,因为这个想起我上一次写的那个项目,最后因为时间赶,也是这个问题,竟然将一些类改成在构造函数中只保存数据...
一个变通:
|
|
返回顶楼 | |
发表时间:2007-01-17
我运行了你的代码,输出的结果不是你写的那样,而是:
Parent:undefined Parent:linxf linxf linxf--24 是不是可以忽略Child.prototype = new Parent;这个parent的构造过程,或者在Parent中做判断,比如没有参数的时候还是保持内部的属性是初始状态。这样你只要保证你在Child的定义中一定要对Parent.apply一下就行了吧。 另外Class.extend怎么用?我学习一下。 |
|
返回顶楼 | |
发表时间:2007-01-17
AnyRock 写道 另外Class.extend怎么用?我学习一下。 就是简单的属性拷贝,对解决楼主的问题没什么帮助。 |
|
返回顶楼 | |
发表时间:2007-01-17
netfishx,我想复杂的了解一下这个“简单的属性拷贝"....
|
|
返回顶楼 | |
发表时间:2007-01-17
看代码就明白了,确实没什么复杂的:
Object.extend = function(destination, source) { for (var property in source) { destination[property] = source[property]; } return destination; } |
|
返回顶楼 | |