Javascript函数重载,存在呢—还是存在呢?
1.What's is 函数重载?
2.静态语言的重载
#include <iostream>using namespace std;void print(int i) {cout <<"Here is num " << i << endl;}void print(string str) {cout << "Here is string " <<str<< endl;}int main() {print(10);//Here is int 10print("ten");//Here is string ten}
function print(i) {console.log("Here is num"+i);}function print(str) {console.log("Here is string "+str);}print(100);//Here is string 100print("ten");//Here is string ten


3.如何实现具有Javascript特色的函数重载
- Using different names in the first place(使用不同的函数名)
function printNum(num) {console.log("Here is num "+num);}function printString(str) {console.log("Here is string "+str);}printNum(100);//Here is num 100printString("ten");//Here is string ten
- Using optional arguments like
y = y || 'default'(检测是否提供实参,否则采用默认值)
举例说明,现在我们要同时打印一个数字和一个字符串
function print(num,str){var inner_num=num||0;var inner_str=str||"default";console.log("Here is num "+inner_num);console.log("Here is string "+inner_str);}print();//Here is num 0//Here is string defaultprint(10);//Here is num 10//Here is string defaultprint(10,"ten");//Here is num 10//Here is string ten
- Using number of arguments(根据参数数量来实现重载)
function print(num,str){var len=arguments.length;if (len===1) {console.log("Here is num "+num);}else if (len===2) {console.log("Here is num "+num);console.log("Here is string "+str);}else{console.log("看....,飞碟!");}}print();//看....,飞碟!print(10);//Here is num 10print(10,"ten");//Here is num 10//Here is string ten
- Checking types of arguments (根据参数类型来实现重载)
function print(num,str){if (typeof num=="number") {console.log("Here is num "+num);}if (typeof str=="string") {console.log("Here is string "+str);}}print();//无输出print(10);//Here is num 10print('',"ten");//Here is string tenprint(10,"ten");// Here is num 10// Here is string ten

function print(num,str){var len=arguments.length;if((len===1)&& (typeof arguments[0]==="number")){console.log("Here is num "+arguments[0]);}else if ((len===1)&& (typeof arguments[0]==="string")) {console.log("Here is string "+arguments[0]);}else if((len===2)&& (typeof arguments[0]==="number")&& (typeof arguments[1]==="string")) {console.log("Here is num "+arguments[0]);console.log("Here is string "+arguments[1]);}else{console.log("看....,飞碟!");}}print();//看....,飞碟!print(10);//Here is num 10print("ten");//Here is string tenprint(10,"ten");// Here is num 10// Here is string ten
function foo(a, b, opts) {}foo(1, 2, {"method":"add"});foo(3, 4, {"test":"equals", "bar":"tree"});
function sayName(name){alert(name);}function sum(num1, num2){return num1 + num2;}function sayHi(){alert("hi");}alert(sayName.length); //1alert(sum.length); //2alert(sayHi.length); //0
■ 通过其length属性,可以知道声明了多少命名参数
■ 通过arguments.length,可以知道在调用时传入了多少参数
下面介绍一下大牛是如何实现借助这个特性实现函数的重载的
var ninja = {};addMethod(ninja,'whatever',function(){ /* do something */ });addMethod(ninja,'whatever',function(a){ /* do something else */ });addMethod(ninja,'whatever',function(a,b){ /* yet something else */ });
function addMethod(object, name, fn) {var old = object[name]; //保存原有的函数,因为调用的时候可能不匹配传入的参数个数object[name] = function() { // 重写了object[name]的方法,是一个匿名函数// 如果该匿名函数的形参个数和实参个数匹配,就调用该函数if(fn.length === arguments.length) {return fn.apply(this, arguments);// 如果传入的参数不匹配,就调用原有的参数} else if(typeof old === "function") {return old.apply(this, arguments);}}}
- 第一个为要绑定方法的对象,
- 第二个为绑定方法所用的属性名称,
- 第三个为需要绑定的方法(一个匿名函数)

//addMethodfunction 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 printer= {};// 不传参数时,打印“飞碟”addMethod(printer, "print", function() {console.log("看,飞碟!");});// 传一个参数时,打印数字addMethod(printer, "print", function(num) {console.log("Here is num "+num);});// 传两个参数时,打印数字和字符串addMethod(printer, "print", function(num,str) {console.log("Here is num "+ num);console.log("Here is string "+str);});// 测试:printer.print(); //看,飞碟!printer.print(10); //Here is num 10printer.print(10, "ten");//Here is num 10//Here is string ten
// Function.prototype.overload - By 沐浴星光Function.prototype.overload = function(fn) {var old= this;return function() {if (fn.length===arguments.length) {return fn.apply(this,arguments);}else{return old.apply(this,arguments);}}}// 不传参数时,打印“飞碟”function printNone() {console.log("看,飞碟!");}// 传一个参数时,打印数字function printInt(num) {console.log("Here is num "+num);}// 传两个参数时,打印数字和字符串function printBoth(num,str) {console.log("Here is num "+ num);console.log("Here is string "+str);}print=function(){};print=print.overload(printNone).overload(printInt).overload(printBoth);print();//看,飞碟!print(10);//Here is num 10print(10,"ten");// Here is num 10// Here is string ten

Javascript函数重载,存在呢—还是存在呢?的更多相关文章
- javascript 函数重载 overloading
函数重载 https://en.wikipedia.org/wiki/Function_overloading In some programming languages, function over ...
- JavaScript函数重载
译者按: jQuery之父John Resig巧妙地利用了闭包,实现了JavaScript函数重载. 原文: JavaScript Method Overloading 译者: Fundebug 为了 ...
- [转载]浅谈JavaScript函数重载
原文地址:浅谈JavaScript函数重载 作者:ChessZhang 上个星期四下午,接到了网易的视频面试(前端实习生第二轮技术面试).面了一个多小时,自我感觉面试得很糟糕的,因为问到的很多问题都 ...
- javascript arguments与javascript函数重载
1.所 有的函数都有属于自己的一个arguments对象,它包括了函所要调用的参数.他不是一个数组,如果用typeof arguments,返回的是’object’.虽然我们可以用调用数据的方法来调用 ...
- JavaScript “函数重载”
函数重载(function overloading)必须依赖两件事情:判断传入参数数量的能力和判断传入参数类型的能力. JavaScript的每个函数都带有一个仅在这个函数范围内作用的变量argume ...
- 浅谈JavaScript函数重载
上个星期四下午,接到了网易的视频面试(前端实习生第二轮技术面试).面了一个多小时,自我感觉面试得很糟糕的,因为问到的很多问题都很难,根本回答不上来.不过那天晚上,还是很惊喜的接到了HR面电话.现在HR ...
- javascript 函数重载另一种实现办法
最近在读javascript忍者 感受下jquery作者 john Resig对于js的独到见解. 先上代码: function addMethod(object,name,fn){ var old ...
- 理解javascript函数的重载
javascript其实是不支持重载的,这篇文章会和java语言函数的重载对比来加深对javascript函数重载的理解. 以下我会假设读者不了解什么是重载所以会有一些很基础的概念 ...
- JavaScript模拟函数重载
JavaScript是没有函数重载的,但是我们可以通过其他方法来模拟函数重载,如下所示: <!DOCTYPE html> <html> <head> <met ...
随机推荐
- [uva11722&&cogs1488]和朋友会面Joining with Friend
几何概型,<训练指南>的题.分类讨论太神啦我不会,我只会萌萌哒的simpson强上~这里用正方形在y=x-w的左上方的面积减去在y=x+w左上方的面积就是两条直线之间的面积,然后切出来的每 ...
- ADMM与one-pass multi-view learning
现在终于开始看论文了,机器学习基础部分的更新可能以后会慢一点了,当然还是那句话宁愿慢点,也做自己原创的,自己思考的东西.现在开辟一个新的模块----多视图学习相关论文笔记,就是分享大牛的paper,然 ...
- Promise deeply lookup
Motivation Consider the following synchronous JavaScript function to read a file and parse it as JSO ...
- MVC是一个经典的设计模式
MVC的架构:具体是模型(Model).视图(View)和控制器(Controller). MVC模式的目的是实现一种动态的程式设计,使后续对程序的修改和扩展简化,并且使程序某一部分的重复利用成为可能 ...
- margin和padding的区别
目前web2.0已经越来被人们认可,因为喜欢搞web开发的人员不得不硬着头皮去学习web2.0的标准,其中很重要的一条就是新的布局规则,div+css.以前基本上是用table布局的,这种传统的方式简 ...
- Unicode文件读取 出现隐藏字符 (大坑)
C#读取文件..分析时发现应该15位的.. str.Lenght 却 16位.. 字符串复制出来一位位的数..就是15位.. 纳闷中突然想起来会不会是隐藏字符.. 输出 str[0].ToBytes( ...
- 探索Aspnetcore+mysql+efcore
摘要 之前尝试了,新建asp.net core站点,那么如何和mysql建立连接,如果操作mysql?本篇将尝试使用EntityFrameworkCore进行mysql的操作. 一个例子 首先新建一个 ...
- 扼杀 304,Cache-Control: immutable
随着近些年社交网站的流行,越来越多的人学会了“刷”网页 ── 刷微博,刷朋友圈,刷新闻,刷秒杀页.这里的“刷”,就是刷新的意思,在浏览器里,你可以通过点击刷新按钮,或者用快捷键,或者移动端的下拉操作来 ...
- PHP格式化显示文件大小函数
用filesize() 函数可以返回文件的大小,可是返回值是以字节(B)为单位的,看起来不方便.怎么让它根据文件的大小自动以KB.MB.GB为单位显示呢,用下面这个函数就可以实现了. <?php ...
- Linux C 中 fork() 函数详解
一.fork入门知识 一个进程,包括代码.数据和分配给进程的资源.fork() 函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同 ...