JavaScript中的方法重载实例

.NET里面的方法重载用着的确很方便,哪Javascript里面能不能也哪样做呢?

Javasciprt里面本生是没有方法重载的功能,以前很多人的做法可能是直接少传参数过去,然后在根据参数是否为 “undefined” 未定义来决定怎么处理,从而实现类似方法重载的功能。

例如:

代码如下:

var showMessage = function(name,value,id){
    if(id != ”undefined”){
        alert(name+value+id);
    }
    else if(value != ”undefined”){
        alert(name + value);
    }
    else{
        alert(name);
    }
}

showMessage(”哈哈”);
showMessage(”哈哈”,”??”);
showMessage(”哈哈”,”??”,124124);

今天在Ajaxian上面看到了一篇关于Javascript方法重载的写法,它是能过另外一个方法来实现的。

看一下这个代码:

代码如下:

// addMethod - By John Resig (MIT Licensed)
function addMethod(object, name, fn){
    var old = object[ name ];
    object[ name ] = function(){
        if ( fn.length == arguments.length ){
         return fn.apply( this, arguments );
     }
     else if ( typeof old == 'function' ){
      return old.apply( this, arguments );
  }
}
};

var UserInfo = function(){
    addMethod(this,”find”,function(){
        alert(”没有参数”);
    });

addMethod(this,”find”,function(name){
        alert(”传入的参数是一个,叫 ”+name);
    });

addMethod(this,”find”,function(name,value){
        alert(”传入了两个参数,一个叫 name=”+name+” 一个叫 value=”+value);
    });
};

var userinfo = new UserInfo();
userinfo.find();
userinfo.find('我是谁?');
userinfo.find('某某某','1512412514');

看,这样一来就简单了……

时间: 2015-03-15

JS模拟实现方法重载示例

本文实例讲述了JS模拟实现方法重载.分享给大家供大家参考,具体如下: 在JS方法中,不能像C#方法能实现重载,但是我们可以通过js中的arguments来实现js方法的重载. 下面给出html实例: <html> <head> <title>JS方法的重载</title> <script> function testFun1(arm1){ /// <summary> /// JS重载测试被调用方法1 /// </summary&

JS函数重载的解决方案

在面向对象的编程中,很多语言都支持函数重载,能根据函数传递的不同个数.类型的参数来做不同的操作,JS对它却不支持,需要我们额外做些小动作. 在JS的函数执行上下文中有一个名为arguments的有意思的变量,它以数组的形式存储了函数执行时传递过来的所有参数,即使函数定义没有定义这 么多个形参.还有一个特别之处就是跟Array类型相比,arguments变量有且只有一个length属性,Array的方法,例如push.pop 等,它并不具备,它只是一个"伪数组":具有length属性,存

重载toString实现JS HashMap分析

不过请仔细对比一下,你会发现其中差别还是很大的.Java HashMap的key是Object类型,所以可以任何类型的参数,而JS的key只能是字符串或是数字. 你也许会说,obj={};map[obj]=1;这段代码传入了既不是数字也不是字符的key,但也没发生错误啊.那是因为解释器将obj对象通过内置的toString方法转换成"[object Object]"这段字符了,你可以用for each下map看看.而java之所以能够接受任何类型的key,是因为其Object实现了Ha

如何实现JS函数的重载

javascript不能支持函数的重载,如下: 复制代码 代码如下: <script language="JavaScript"> function f(length) {     alert("高为:"+length); } function f(length,width) {     alert("高为:"+length+",宽为:"+width); } </srcipt> 上面那段代码其实是行不通

JS重载实现方法分析

本文实例分析了JS重载实现方法.分享给大家供大家参考,具体如下: 重载是面向对象语言里很重要的一个特性,JS中没有真正的重载,是模拟出来的(因为js是基于对象的编程语言,不是纯面向对象的,它没有真正的多态:如继承.重载.重写) 一.什么时候用重载? 举例: function getDataTop10(){ alert("返回前10条数据"); } 后来需求改了,需要获得20条数据,而getDataTop10又被很多函数调用了,整体替换可以但麻烦,这时可以用重载 进而引出什么是重载:函数

javascript中通过arguments参数伪装方法重载

在很多面向对象的高级语言中,都有方法的重载.而javascript没有方法重载这个概念.但是我们可以通过arguments这个参数来伪装成函数的重载 在模拟之前我们先看一下代码: 复制代码 代码如下: //表面上没有声明形式参数的函数 function fun() { alert("示例代码"); } fun("小明", 100, true);//自己写了三个实际参数 通过结果我们看到,即使我们声明函数的时候没有定义形式参数,在调用方法的时候,我们也是可以写实际参数

js中方法重载如何实现?以及函数的参数问题

都知道在js中没有办法直接实现方法重载,因为在js中如果定义了多个名称相同,但参数个数不一样的方法,其实只有最后一个方法能被真正调用,其他的方法都被覆盖掉了. 但每一个函数都有一个特殊的参数arguments,利用它可以实现方法的重载. 例如: 复制代码 代码如下: function Add(firstnumber,sencondnumber) { return firstnumber+sencondnumber; } 只能处理两个参数,如果有多个参数,或者没有参数,一个参数的情况都是处理不了的

Javascript基础 函数“重载” 详细介绍

Javascript不像其他编程语言一样具有函数签名(什么是函数签名,简单的说就是说函数的接受参数类型和参数个数,也有人认为返回类型也应该包括.具体概念大家可以到网上查询). 所以Javascript是不能像其他语言一样实现方法名相同,参数个数不同-的这类重载的,不信你可以试试: 复制代码 代码如下: function show(){             alert("1");         }         function show(num1){             a

js 覆盖和重载 函数

学过JAVA的人对函数的覆盖和重载肯定是再熟悉不过了. 重载指两个或多个函数的参数类型,顺序和数量以及返回值不一样. 覆盖指两个或多个函数的参数类型,顺序和数量以及返回值完全一样. 那javascript真的有这种特性么? 回答是JS中函数重名只会采用最后一个定义. 首先来看下下面的代码 复制代码 代码如下: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <HEA

JavaScript 的方法重载效果

在 JavaScript 的方法内,有个叫做 arguments 的变量数组,它是只读的,所有实际传入的参数变量都 放在了里面,通过它,我们可以对传入的参数进行类型检查,从而实现重载的效果. 判断一个变量的类型有两种方法. 1,用 typeof 语句: 复制代码 代码如下: function check(){ if(typeof arguments[0] == 'string') alert('你传入的参数是个字符串'); else if(typeof arguments[0] == 'numb

有关于JS构造函数的重载和工厂方法

写在前面 有时候我们希望对象的初始化有多种方式.比如通过元素组成的数组来初始化一个Set对象,而不是通过传入构造函数的参数列表来初始化它 重载overload 通过重载这个构造函数方法让它根据传入参数的不同,来执行不同的初始化方法. 复制代码 代码如下: function Set() {this.values = {}; // 用这个对象的属性保存这个集合this.n = 0; // 集合中值的个数 // 如果传入一个类数组的对象,将这个元素添加到集合中// 否则,将所有的参数都添加到集合中if

解析C++中构造函数的默认参数和构造函数的重载

C++构造函数的默认参数 和普通函数一样,构造函数中参数的值既可以通过实参传递,也可以指定为某些默认值,即如果用户不指定实参值,编译系统就使形参取默认值. [例] #include <iostream> using namespace std; class Box { public : Box(int h=10,int w=10,int len=10); //在声明构造函数时指定默认参数 int volume( ); private : int height; int width; int l

浅谈js构造函数的方法与原型prototype

把方法写在构造函数内的情况我们简称为函数内方法,把方法写在prototype属性上的情况我们简称为prototype上的方法. •函数内的方法: 使用函数内的方法我们可以访问到函数内部的私有变量,如果我们通过构造函数new出来的对象需要我们操作构造函数内部的私有变量的话, 我们这个时候就要考虑使用函数内的方法. •prototype上的方法: 当我们需要通过一个函数创建大量的对象,并且这些对象还都有许多的方法的时候;这时我们就要考虑在函数的prototype上添加这些方法. 这种情况下我们代码的

详解JS构造函数中this和return

先看一段代码, function Foo(name,age){ this.name=name; this.age=age; } var foo=new Foo("Tom",14); foo.name;//Tom foo.age;//14 使用构造函数实例化发生的流程: 1.建立一个foo的空对象. 2.将构造函数中的Foo的this指向对象foo. 3.foo的_proto_属性指向Foo函数的prototype原型. 4.执行构造函数中的代码. 相对于普通函数,构造函数中的this是

JS构造函数与原型prototype的区别介绍

构造函数方法很好用,但是存在一个浪费内存 通过原型法分配的函数是所有对象共享的. 通过原型法分配的属性是独立.-----如果你不修改属性,他们是共享 如果我们希望所有的对象使用同一一个函数,最好使用原型法添加函数,这样比较节省内存. 例子: //----构造函数模式 为Cat对象添加一个不变的属性"type"(种类),再添加一个方法eat(吃老鼠).那么,原型对象Cat就变成了下面这样: <script> function Cat(name, color) { this.n

C++中复制构造函数和重载赋值操作符总结

前言 这篇文章将对C++中复制构造函数和重载赋值操作符进行总结,包括以下内容: 1.复制构造函数和重载赋值操作符的定义: 2.复制构造函数和重载赋值操作符的调用时机: 3.复制构造函数和重载赋值操作符的实现要点: 4.复制构造函数的一些细节. 复制构造函数和重载赋值操作符的定义 我们都知道,在C++中建立一个类,这个类中肯定会包括构造函数.析构函数.复制构造函数和重载赋值操作:即使在你没有明确定义的情况下,编译器也会给你生成这样的四个函数.例如以下类: 复制代码 代码如下: class CTes

js定义类的几种方法(推荐)

ECMAScript6已经支持了class,但之前版本都不支持类,但是可以通过一些方法来模拟类. js中的类,既是重点,也是难点,很多时候都感觉模棱两可. 首先强调一下js中很重要的3个知识点:this.prototype.constructor. 下面我们来总结一下定义(模拟)类的几种方法: 1.工厂模式 function createObject(name,age){ var obj = new Object(); obj.name = name; obj.age = age; obj.ge

Android源码学习之工厂方法模式应用及优势介绍

工厂方法模式定义: Define an interface for creating an object, but let subclasses decide which class to instantiate. Factory Method lets a class defer instantiation to subclasses. 定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类. 常用的工厂方法模式结构: 如上图所示(截取自<Head Firs

ES6中Proxy与Reflect实现重载(overload)的方法

本文实例讲述了ES6中Proxy与Reflect实现重载(overload)的方法.分享给大家供大家参考,具体如下: Proxy与Reflect实现重载(overload) 从语法角度讲JavaScript不支持重载.原因很简单,JS中函数可以传入任意类型.任意个数的参数,通通可以通过在函数内使用this.arguments获得.这样,就无法实现同名函数参数列表不同实现不同功能.当然,在实际使用过程中,可以人为去检测传入实参的个数及类型,来进行不同操作.但是,我认为这不能叫做重载. ES6带来了

php函数重载的替代方法--伪重载详解

函数重载的替代方法-伪重载,下面看一个具体的实例代码. <? php //函数重载的替代方法-伪重载 // //确实,在PHP中没有函数重载这个概念,让很多时候我们无法进行一些处理,甚至有时候不得不在函数后面定义好N个参数 //在看到了func_get_arg,func_get_args,func_num_args,这三个函数的时候,你们是不是想起了什么? function testOne ( $a ) { echo (' 一个参数就这样 '); } function testTwo ( $a