关于JS继承的问题 这个该如何实现

chNeed1 2008-11-21 05:53:41
var obja = { a: 1, testA: function() { alert("A" + this.a + "次"); this.a++; } };
var objb = { a: 1, testB: function() { alert("B" + this.a + "次"); this.a++; } };
var objc = { a: 1, testC: function() { alert("C" + this.a + "次"); this.a++; } };

var obj=new Object();
我想用obj来继承 obja,objb,objc 拥有原来对象的所有方法,但又能拥有 原来所有的数据obja.a objb.a objc.a
还有如果我子类写有obj.testA=function(){base.a+=10;base.testA();} 这里的base我只是举个例子,意思就是有办法调用基类原来的方法,并可以用到基类原来的属性.
var arr = new Array("A", "B", "C");
for (var i = 0; i < 20; i++) {
eval("obj.test" + arr[Math.round(Math.random() * 10000) % 3] + "();");
}
通过这个循环,那么,执行一次test X 就会做相应的增加. 当然不是递增的.因为每个方法都有自己的私有数据a
这只是个例子,JS能实现吗.
...全文
244 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
chNeed1 2008-11-23
  • 打赏
  • 举报
回复
没错,用prototype+call 可以解决这个问题
那就只剩下私有变量的问题了..
如何才能构造同名私有变量,而基类的命名对子类没影响呢,就相当于高级语言的私有变量一样.
wangliangatleiden 2008-11-22
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 chNeed1 的回复:]
恩,看了,你这方法是用原先的三个对象来构造obj 这样就使得obj有原来的属性和方法了,当然这是可能的,只是还不能完全实现我要的功能,如方法覆盖,
我上面举了个例子,obj.testA=function(){base.a+=10;base.testA();}  这里就是说,在obj里有testA 方法,则在子类里是覆盖了原来obja.testA 方法
并提供一个指向原来的方法的引用, 就是说,我还有办法可以调用obja.testA 这样就可以实现像高级语言嚅的虚拟方法一样
还有,为什么我都要用…
[/Quote]

首先说方法覆盖的问题,我觉得你说的方法覆盖其实就是方法重载吧。
如果想要子类访问父类的函数,可以用

父类名.prototype.函数名.call(this,para1,para2,...)

如果是访问obja.testA的话,则对应的代码就是

obja.prototype.testA.call(this,para1,para2,...)


但是想必你应该知道如果用这种方法,则代码必须改为用prototype继承
chNeed1 2008-11-22
  • 打赏
  • 举报
回复
恩,看了,你这方法是用原先的三个对象来构造obj 这样就使得obj有原来的属性和方法了,当然这是可能的,只是还不能完全实现我要的功能,如方法覆盖,
我上面举了个例子,obj.testA=function(){base.a+=10;base.testA();} 这里就是说,在obj里有testA 方法,则在子类里是覆盖了原来obja.testA 方法
并提供一个指向原来的方法的引用, 就是说,我还有办法可以调用obja.testA 这样就可以实现像高级语言嚅的虚拟方法一样
还有,为什么我都要用a来做为变量呢,其实就像是高级语言的私有属性一样,对子类是不可知的,即子类定义的相同的属性肯定不会覆盖.
wangliangatleiden 2008-11-21
  • 打赏
  • 举报
回复
对于这个问题:我想用obj来继承 obja,objb,objc 拥有原来对象的所有方法,但又能拥有 原来所有的数据obja.a objb.a objc.a

方法如下:

<script>
function obja () {
this.a = 1;
this.testA = function () {
alert("A " + this.a + " time");
this.a++;
}
}


function objb () {
this.b = 1;
this.testB = function () {
alert("B " + this.b + " time");
this.b++;
}
}

function objc () {
this.c = 1;
this.testC = function () {
alert("C " + this.c + " time");
this.c++;
}
}


function obj() {
obja.call(this);
objb.call(this);
objc.call(this);
}

var objtest = new obj();
objtest.testA();
objtest.testB();
objtest.testC();


</script>

注意,我用function方法来创建的类,用call实现继承
chNeed1 2008-11-21
  • 打赏
  • 举报
回复
虽然还搞不懂,也只是讨论,自己顶顶.

87,997

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧