JavaScript面向对象之方法重载

2016-02-19 20:31 4 1 收藏

下面图老师小编要跟大家分享JavaScript面向对象之方法重载,简单的过程中其实暗藏玄机,还是要细心学习,喜欢还请记得收藏哦!

【 tulaoshi.com - Web开发 】

作者: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:a:'+a+'b:'+b + 'the member is' + this.member);}// 演示引用方式传递function Show3(a,b){    arguments[0][0]=2;    alert('2 input parameter is transfer:a:'+a+'b:'+b + 'the 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());/scriptscript 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:a:'+a+'b:'+b + 'the member is' + this.member); } // 演示引用方式传递 function Show3(a,b) { arguments[0][0]=2; alert('2 input parameter is transfer:a:'+a+'b:'+b + 'the 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 

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

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/webkaifa/)

  说明

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/webkaifa/)

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

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

apply方法的语法:

apply([thisObj[,argArray]])

  参数

  thisObj 

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

  argArray 

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

  说明

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/webkaifa/)

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

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

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

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

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

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

来源:http://www.tulaoshi.com/n/20160219/1623902.html

延伸阅读
标签: Web开发
在面向对象的思想中,最核心的概念之一就是类。一个类表示了具有相似性质的一类事物的抽象,通过实例化一个类,可以获得属于该类的一个实例,即对象。 在JavaScript中定义一个类的方法如下: function class1(){ //类成员的定义及构造函数 } 这里class1既是一个函数也是一个类。可以将它理解为类的构造函数,负责初始化工作。...
我是从学习Java编程开始接触OOP(面向对象编程),刚开始使用Java编写程序的时候感觉很别扭,因为我早以习惯用C来编写程序,很欣赏C的简洁性和高效性,喜欢C简练而表达能力丰富的风格,特别忍受不了Java运行起来慢吞吞的速度,相对冗长的代码,而且一个很简单的事情,要写好多类,一个类调用一个类,心里的抵触情绪很强。 我对Java的面...
标签: Web开发
引  近段时间做的两个小纯Js的小游戏 PuzzleGame / Tetris (开发中),对JavaScript的面向对象设计方法进行了不同的尝试。 在PuzzleGame的实践过程中,面向对象的设计方法遭到多次挫折,最终还是大部分函数式编程完成,夹杂了小部分面向对象方法。 而在Tetris的设计初始,偶遇《JavaScript王者归来》(月影 著),翻看了前面小部分内...
标签: Web开发
代码如下: function CallBackObject() { this.XmlHttp = this.GetHttpObject(); } CallBackObject.prototype.GetHttpObject = function() //动态为CallBackObject的原型添加了GetHttpObject共有方法 { //第一步:创建XMLHttpRequest对象 //进行兼容性判断 var xmlhttp; /*@cc_on @if (@_jscript_version = 5) try { xmlhttp = ne...
标签: Web开发
javascript(以下简称JS)不是一门真的的面像对像语言,在JS里并没有正式的类,即使没有真正的类,我们还是叫它类!在这里,我学习一下怎么在JS使用重载! 在JS中有一个特殊对像arguments,我们在开发中不需要显示指出它。如下:  function hello() {             aler...

经验教程

81

收藏

72
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部