模拟重载函数

小编以前写wp的,所有习惯了有函数的重载,根据参数的不同,而可以调用名称相同的函数,可是js中的function对象也是以属性的形式出现的,在一个对象中增加与已有的function同名的function时,旧的function对象则会被覆盖。= =。

那么怎么让js也可以有这种特性呢?js中,每个函数内部,都有arguments对象(包含函数被调用时的实际参数)。

额 ,在这里补充一点,js如果在调用时函数多于方法定义时的形参,则多余的函数会被省掉。对于这里的arguments对象,它的原型是Object.prototype,但它有个和数组一样的属性length,同时实参可以通过[]操作符来获取。

function sayHi(){
switch(arguments.length){
case 0:
return "Hi";

case 1:
return "Hi,"+arguments[0];

case 2:
return (arguments[1]=="cn" ? "你好,":"Hi,")+arguments[0]
};
}

sayHi();  //Hi
sayHi("Fnncat"); //Hi,Fnncat
sayHi("Fnncat","cn");//你好,Fnncat

callee是arguments对象的一属性,其值是当前正在执行的function对象。它的作用是使匿名function可以被递归调用。

时间: 2024-10-29 10:46:21

模拟重载函数的相关文章

C用函数指针模拟重载 C++重载

C中为什么不支持重载,即同一作用域内不允许出现同名函数? 我们都知道重载是c++面向对象的特性.c语言中是不存在的.所谓重载简单来说就是一个函数名可以实现不同的功能,要么输入参数不同或者参数个数不同,要么返回类型不同.例如函数add(),在c++中可以轻易实现int,double等不同类型参数的相加功能,而在c语言中却不能这样实现.c语言中实现重载功能,或者准确来说是类似重载的功能,可以通过函数指针的方式来实现. 函数指针定义 形式1:函数类型 (*指针变量名)(形参列表): “函数类型”说明函

JavaScript 模拟重载

/** * 参数个数对应 各自处理的函数 不指定 则执行 默认函数 * [ * d : function ( ) {} * , 0 : function ( ) {} * , 1 : function ( a ) {} * , 2 : function ( a, b ) {} * , 3 : function ( a, b , c ) {} * , 4 : function ( a, b , c, d ) {} * ] */ ! function () { var _reload = ( fun

C++:运算符重载函数之"++"、"--"、"[ ]"的应用

5.2.5 "++"和"--"的重载 对于前缀方式++ob,可以用运算符函数重载为: ob.operator++() //成员函数重载 或 operator++(X &ob) //友元函数重载,其中ob为类X的对象的引用 对于后缀方式++ob,可以用运算符函数重载为: ob.operator++(int) //成员函数重载 或 operator++(X &ob,int) //友元函数重载,其中ob为类X的对象的引用 调用时,参数int一般被传递给值0

C++:运算符重载函数之成员运算符重载函数

5.2.3 成员运算符重载函数 在C++中可以把运算符重载函数定义为某个类的成员函数,称之为成员运算符重载函数. 1. 定义成员运算符重载函数的语法形式 (1)在类的内部,定义成员运算符重载函数的格式如下: 函数类型 operator 运算符(形参表) {       函数体 } (2)成员运算符重载函数也可以在类中声明成员函数的原型,在类外定义. 在类的内部,声明成员运算符重载函数原型的格式如下: class X{      ...      函数类型 operator运算符(参数表); };

第五篇:明确拒绝不想编译器自动生成的拷贝构造函数和赋值运算符重载函数

前言 如果你不想要编译器帮你自动生成的拷贝机制 (参考前文),那么你应当明确的拒绝. 如何拒绝?这便是本文要解决的主要问题. 问题描述 当你定义了一个类,而这个类中各对象之间也是封装的 - 禁止同类对象之间的相互赋值以及复制,那么你需要屏蔽掉编译器帮你生成的拷贝构造函数以及赋值运算符. 在许多代码中,会看到通过将拷贝构造函数和赋值运算符重载函数声明为私有且不予实现来实现这个功能.然而,这不是最科学的做法. 因为这没有做到真正的屏蔽:你在自己的成员函数中,或者友元函数中仍然可以调用这两个私有函数,

C++:运算符重载函数之友元运算符重载

5.2.2 友元运算符重载函数 运算符重载函数一般采用两种形式定义: 一是定义为它将要操作的类的成员函数(简称运算符重载函数): 二是定义为类的友元函数(简称为友元运算符重载函数). 1.定义友元运算符重载函数的语法如下: 在类的内部: friend 函数类型 operator运算符(形参表) { 函数体 } 在类的内部声明,在类外定义: class X{ ... friend 函数类型 operator运算符(形参表): }; 函数类型 X::operator运算符(形参表) { 函数体 }

重载函数

出现在相同的作用域中的两个函数,如果具有相同的名字而形参表不同.则称为 重载函数(overloaded function) 任何程序都仅有一个main 函数的实例.main 函数不能重载 函数重载和重复声明的区别 如果两个函数声明的返回类型和形参表完全匹配,则将第二个函数声明视为第一个的重复定义. 如果两个函数的形参表完全相同,但返回类型不同,则第二个声明是错误的.(然而  使用const  是可以被重载 的)   函数不能仅仅基于不同的返回类型而实现重载,但是可以基于const  (常量性)

明确拒绝不想编译器自动生成的拷贝构造函数和赋值运算符重载函数

前言 如果你不想要编译器帮你自动生成的拷贝机制 (参考前文),那么你应当明确的拒绝. 如何拒绝?这便是本文要解决的主要问题. 问题描述 当你定义了一个类,而这个类中各对象之间也是封装的 - 禁止同类对象之间的相互赋值以及复制,那么你需要屏蔽掉编译器帮你生成的拷贝构造函数以及赋值运算符. 在许多代码中,会看到通过将拷贝构造函数和赋值运算符重载函数声明为私有且不予实现来实现这个功能.然而,这不是最科学的做法. 因为这没有做到真正的屏蔽:你在自己的成员函数中,或者友元函数中仍然可以调用这两个私有函数,

重载函数编译后的新名字

我们都知道很多语言都支持函数重载,那么编译器是怎么处理编译后它们的命名冲突的呢? 1.先给出几个正确的重载函数: #include <iostream> using namespace std; int Add(int a, int b) { return a + b; } double Add(double a, double b) { return a + b; } double Add(double a, int b) { return a + b; } double Add(int a