javascript 同时支持重写继承求解?

hckxzy 2011-06-23 04:44:55
原型继承实现方式:
function Circle(radius) { //定义父类Circle
this.radius = radius;
}
Circle.prototype.area = function() { //定义父类的方法area计算面积
return this.radius * this.radius * 3.14;
}

function PositionCircle(x,y,radius) { //定义类PositionCircle
this.x = x; //属性横坐标
this.y = y; //属性纵坐标
Circle.call(this,radius); //调用父类的方法,相当于调用this.Circle(radius),设置PositionCircle类的
//radius属性
}
PositionCircle.prototype = new Circle(); //设置PositionCircle的父类为Circle类

var pc = new PositionCircle(1,2,1);
alert(pc.area()); //3.14
//PositionCircle类的area方法继承自Circle类,而Circle类的
//area方法又继承自它的prototype属性对应的prototype对象
alert(pc.radius); //1 PositionCircle类的radius属性继承自Circle类

/*
注意:在前面我们设置PositionCircle类的prototype属性指向了一个Circle对象,
因此pc的prototype属性继承了Circle对象的prototype属性,而Circle对象的constructor属
性(即Circle对象对应的prototype对象的constructor属性)是指向Circle的,所以此处弹出
的是Circ.
*/
alert(pc.constructor); //Circle

/*为此,我们在设计好了类的继承关系后,还要设置子类的constructor属性,否则它会指向父类
的constructor属性
*/
PositionCircle.prototype.constructor = PositionCircle
alert(pc.constructor); //PositionCircle


原型实现重写:
function BaseObj(v1){this.value=v1};
function Obj2(v2){this.value="2222222" ,this.oth = v2};

BaseObj.prototype.fun = function (){alert(this.value);}

Obj2.prototype = new BaseObj();

o2 = new Obj2("22222.value");
o2.fun();
//子类重写父类的fun方法
Obj2.prototype.fun = function (){Obj2.prototype.constructor.prototype.fun.call(this);}


如果想同时实现继承,重写,红色的代码出现了矛盾,请问如何解决?
(实现继承最后是要把子类的prototype.constructor指向其子类本身,而要想实现重写,子类又要通过prototype.constructor访问到父类)


...全文
173 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
hckxzy 2011-06-24
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 hckxzy 的回复:]

引用 10 楼 xingqiliudehuanghun 的回复:

JScript code
function BaseObj(v1){
this.value=v1
};
BaseObj.prototype.fun = function (){alert(this.value);}

function Obj2(v2){
this.value="2222222";
this.……
[/Quote]

想问大侠为什么此句
Obj2.prototype.super = BaseObj.prototype;
之后,就影响了Obj2.prototype.constructor的指向为BaseObj。
hckxzy 2011-06-24
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 xingqiliudehuanghun 的回复:]

JScript code
function BaseObj(v1){
this.value=v1
};
BaseObj.prototype.fun = function (){alert(this.value);}

function Obj2(v2){
this.value="2222222";
this.oth = v2
};



Obj2.prototype =……
[/Quote]

想问大侠为什么此句
Obj2.prototype.super = BaseObj.prototype;
之后,就影响了Obj2.prototype的指向为BaseObj。
hckxzy 2011-06-24
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 xingqiliudehuanghun 的回复:]

JScript code
function BaseObj(v1){
this.value=v1
};
BaseObj.prototype.fun = function (){alert(this.value);}

function Obj2(v2){
this.value="2222222";
this.oth = v2
};



Obj2.prototype =……
[/Quote]

大侠解释甚好,想问大侠prototype还有什方法和属性没?
  • 打赏
  • 举报
回复
function BaseObj(v1){
this.value=v1
};
BaseObj.prototype.fun = function (){alert(this.value);}

function Obj2(v2){
this.value="2222222";
this.oth = v2
};



Obj2.prototype = new BaseObj();;
Obj2.prototype.super = BaseObj.prototype;
Obj2.prototype.constructor = Obj2;

Obj2.prototype.fun = function (){
this.super.fun.call(this);
alert(this.oth)
};


o2 = new Obj2("22222.value");
o2.fun();
kyzy_yy_pm 2011-06-24
  • 打赏
  • 举报
回复
<script>
function BaseObj(v1){this.value=v1};

function Obj2(v2){this.value="2222222" ,this.oth = v2};

BaseObj.prototype.fun = function (){alert(this.value);}

Obj2.prototype = new BaseObj();

o2 = new Obj2("22222.value");

//o2.fun();

Obj2.prototype.fun = function (){Obj2.prototype.constructor.prototype.fun.call(this);alert("没问题啊");}

o2.fun();
</script>
KK3K2005 2011-06-24
  • 打赏
  • 举报
回复
关键点 在继承里面 子类必须要能访问到超类的原型
则必定要有 类似 super的字段 不为空则表示超类

剩下的就是 你构建的 对象体系的 系统方法(必要方法,比如有没有一个初始化的入口方法)
和 超类对象的允许访问时机
hckxzy 2011-06-24
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 jhrxx 的回复:]

用原型链可以复制一个父原型对象,并且可以修改复制的对象的属性,如果没有改写原型对象的方法还是可以获得写原型对象的方法的
[/Quote]

这样会把父类的方法也修改了
jhrxx 2011-06-24
  • 打赏
  • 举报
回复
用原型链可以复制一个父原型对象,并且可以修改复制的对象的属性,如果没有改写原型对象的方法还是可以获得写原型对象的方法的
hckxzy 2011-06-24
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 kyzy_yy_pm 的回复:]

引用 2 楼 fanchuanzhidu 的回复:

首先对LZ的这种细致的学习精神表示敬仰

这个问题问的非常好
//子类重写父类的fun方法
Obj2.prototype.fun = function (){Obj2.prototype.constructor.prototype.fun.call(this);}
既然要重写为什么还要调父类的fun呢

他是想,积既继承父类……
[/Quote]
对就是3楼说的,求解?
kyzy_yy_pm 2011-06-24
  • 打赏
  • 举报
回复
<script>
function Parent(){}

Parent.prototype.say = function(){
alert("a");
}

function Child(){}

Child.prototype = new Parent();

Child.prototype.say = function(){
Child.prototype.constructor.prototype.say.call(this);
alert(1);
}

var c = new Child();

c.say();

</script>
kyzy_yy_pm 2011-06-24
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 fanchuanzhidu 的回复:]

首先对LZ的这种细致的学习精神表示敬仰

这个问题问的非常好
//子类重写父类的fun方法
Obj2.prototype.fun = function (){Obj2.prototype.constructor.prototype.fun.call(this);}
既然要重写为什么还要调父类的fun呢
[/Quote]
他是想,积既继承父类该方法中的方法,并在此基础上新加功能代码
豆虫 2011-06-23
  • 打赏
  • 举报
回复
首先对LZ的这种细致的学习精神表示敬仰

这个问题问的非常好
//子类重写父类的fun方法
Obj2.prototype.fun = function (){Obj2.prototype.constructor.prototype.fun.call(this);}
既然要重写为什么还要调父类的fun呢
kyzy_yy_pm 2011-06-23
  • 打赏
  • 举报
回复
我也想知道,顶顶

87,907

社区成员

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

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