王朝网络
分享
 
 
 

JavaScript面向对象之方法重载

王朝html/css/js·作者佚名  2008-08-25
宽屏版  字体: |||超大  

作者:Truly http://truly.cnblogs.com/

日期:2007.7.29

上次我们在《在JavaScript中使用面向对象》讨论了对象的声明、成员的声明、全局变量和局部变量以及命名空间的处理。本文继续讨论面向对象,今天介绍方法重载。

http://www.cnblogs.com/Truly/archive/2007/07/24/830013.html

同时上次有人询问Function对象的apply方法和call方法的区别,本文将一并进行探讨。

首先我们需要知道Javascript有很多语言特点使得我们不能完全按照以往的编程经验进行编程,比如方法重载。在前一篇文章中,我们已经介绍过,在Javascript中后面的同名变量会覆盖前面的,所以想直接声明重载方法是不可行的。但是,Javascript的魅力就在于灵活,因此所有的期望都必然得到答案。

为了节省时间,今天我将所有的代码集中在一起,不再独立讲解,请看如下代码:

<script type='text/javascript'>function ABC(){ this.member = 1; this.method = Show;}function Show(a,b,c){ this.member = 123; if(arguments.length==1) if(arguments[0].constructor == Number) Show1_int.apply(this, arguments); else if(arguments[0].constructor == Date) Show1_date.apply(this, arguments); else Show1_string.apply(this, arguments); if(arguments.length==2) if(arguments[0].constructor == Array) Show3.apply(this,arguments); else Show2.apply(this,arguments);}function Show1_int(a){ alert('1 integer input parameter ' + a+ ' methode is called');}function Show1_string(a){ alert('1 string input parameter ' + a+ ' methode is called');}function Show1_date(a){ alert('1 date input parameter ' + a+ ' methode is called');}function Show2(a,b){ alert('2 input parameter is transfer:\na:'+a+'\nb:'+b + '\nthe member is' + this.member);}// 演示引用方式传递function Show3(a,b){ arguments[0][0]=2; alert('2 input parameter is transfer:\na:'+a+'\nb:'+b + '\nthe member is' + this.member);}var o = new ABC();var arr = new Array();arr[0]=321;o.method(arr[0],2); // 值传递alert(arr[0]); // 原始值未改变o.method(arr,2); // 引用方式传递alert(arr[0]); // 方法调用时被方法修改o.method(new Date());</script><script type='text/javascript'> function ABC() { this.member = 1; this.method = Show; } function Show(a,b,c) { this.member = 123; if(arguments.length==1) if(arguments[0].constructor == Number) Show1_int.apply(this, arguments); else if(arguments[0].constructor == Date) Show1_date.apply(this, arguments); else Show1_string.apply(this, arguments); if(arguments.length==2) if(arguments[0].constructor == Array) Show3.apply(this,arguments); else Show2.apply(this,arguments); } function Show1_int(a) { alert('1 integer input parameter ' + a+ ' methode is called'); } function Show1_string(a) { alert('1 string input parameter ' + a+ ' methode is called'); } function Show1_date(a) { alert('1 date input parameter ' + a+ ' methode is called'); } function Show2(a,b) { alert('2 input parameter is transfer:\na:'+a+'\nb:'+b + '\nthe member is' + this.member); } // 演示引用方式传递 function Show3(a,b) { arguments[0][0]=2; alert('2 input parameter is transfer:\na:'+a+'\nb:'+b + '\nthe member is' + this.member); } var o = new ABC(); var arr = new Array(); arr[0]=321; o.method(arr[0],2); // 值传递 alert(arr[0]); // 原始值未改变 o.method(arr,2); // 引用方式传递 alert(arr[0]); // 方法调用时被方法修改 o.method(new Date()); </script>

我们无法直接定义重载方法,但是却可以为其他函数定义一个公开的重载方法调用。通过这种方式,对于调用者而言,重载的方法是透明的,只需调用方法名并传入适当的参数即可,与多数高级语言一样,不可定义传入参数相同而返回类型不同的重载方法。

下面我们再分析一下call和apply的区别,所有的函数都具有这两个方法,它们在使用上没有太大差别,主要区别就在于传入参数不同:

call使用可变参数序列进行值传递,而apply则使用数组或者arguments对象进行传递。

call方法的语法:

call([thisObj[,arg1[, arg2[, [,.argN]]]]])

参数

thisObj

可选项。将被用作当前对象的对象。

arg1, arg2, , argN

可选项。将被传递方法参数序列。

说明

call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。

如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj。

apply方法的语法:

apply([thisObj[,argArray]])

参数

thisObj

可选项。将被用作当前对象的对象。

argArray

可选项。将被传递给该函数的参数数组。

说明

如果 argArray 不是一个有效的数组或者不是 arguments 对象,那么将导致一个 TypeError。

如果没有提供 argArray 和 thisObj 任何一个参数,那么 Global 对象将被用作 thisObj, 并且无法被传递任何参数。

注:以上资料来自《Jscript参考手册》

小节:通过show2方法,我们看到使用call或者apply方式可以将当前对象传递到方法内部,以此来访问当前对象的一些成员。这使得我们可以定义一些方法,给不同的自定义类进行调用,具体可以查看上篇文章我们定义的一个继承结构。

同时通过上面例子我们还演示了两者进行传递时,参数的传递方式会根据参数的不同而不同,如果是值变量则使用值传递,否则以引用方式传递。

尾声:当我们使用JavaScript的时候,你必须了解和掌握JavaScript的一些特点,它跟高级编程语言存在着一些区别,它灵活的特点给我们的开发带来了极大的灵活性,因此一旦深入JavaScript编程,我保证,你会毫无理由的喜欢上它。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
>>返回首页<<
推荐阅读
 
 
频道精选
 
静静地坐在废墟上,四周的荒凉一望无际,忽然觉得,凄凉也很美
© 2005- 王朝网络 版权所有