实现js中的重载
重载是面向对象语言里很重要的一个特性,JS中没有真正的重载,是模拟出来的(因为js是基于对象的编程语言,不是纯面向对象的,它没有真正的多态:如继承、重载、重写)
一、什么时候用重载?
举例:
function getDataTop10(){
alert("返回前10条数据");
}
后来需求改了,需要获得20条数据,而getDataTop10又被很多函数调用了,整体替换可以但麻烦,这时可以用重载
进而引出什么是重载:函数名相同,但是可以区分出来,想用哪个就用哪个,而不是后面的同名函数覆盖前面的
二、怎么用?
arguments:Js里的一个内置对象,包含了调用者传递的实际参数(函数声明时定义的参数个数不影响)
function getData(){
alert("返回所有数据");
}
function getDataTop(num){
alert("返回前"+num+"数据");
}
function getDataLimit(num1,num2){
alert("返回前"+num1+"-"+num2+"数据");
}
function getDste(){
var num=arguments.length;
if(!num){
getData();
}
else if(num==1){
getDataTop(arguments[0]);
}
else if(num==2){
getDataLimit(arguments[0],arguments[1]);
}
}
getDste(5)
当参数很多时要写一大串,遂可以改进
function getData(){
alert("返回所有数据");
}
function getDataTop(num){
alert("返回前"+num+"数据");
}
function getDataLimit(num1,num2){
alert("返回前"+num1+"-"+num2+"数据");
}
function getDste(){
var num=arguments.length;
if(!num){
getData();
}
else if(num==1){
getDataTop.apply(this,arguments);
}
else if(num==2){
getDataLimit.apply(this,arguments);
}
}
getDste(5)
如果参数个数相同,类型不同,又该如何
function getData(){
alert("返回所有数据");
}
function getDataTop(num){
alert("返回前"+num+"数据");
}
function getDataLimit(num1,num2){
alert("返回前"+num1+"-"+num2+"数据");
}
function getDataByType(type){
alert("将返回"+type+"类型的数据");
}
function getDste(){
var num=arguments.length;
if(!num){
getData();
}
else if(num==1){
if(typeof arguments[0]=="number"){
getDataTop.apply(this,arguments);
}
else{
getDataByType.apply(this,arguments);
}
}
else if(num==2){
getDataLimit.apply(this,arguments);
}
}
getDste("array")
三、好处
有利于合作开发
四、坏处
“实现”太勉强,如果参数过多,就要很多if语句,显得代码很乱
实现js中的重载的更多相关文章
- JS中函数参数和函数返回值的理解
函数本质就是功能的集合 JS中函数是对象,因此,函数名实际上仅仅是一个指向函数对象的指针,不会与某个函数绑定,所以,JS中没有重载(重载就是通过传递不同类型的参数,使两个相同函数名的函数执行不同的功能 ...
- js中的面向对象入门
什么是对象 我们先来看高程三中是如何对对象进行定义的 "无序属性的集合,其属性可以包括基本值.对象或者函数",对象是一组没有特定顺序的的值.对象的没个属性或方法都有一个俄名字,每个 ...
- 对JS中函数的理解
函数本质就是功能的集合 JS中函数是对象,因此,函数名实际上仅仅是一个指向函数对象的指针,不会与某个函数绑定,所以,JS中没有重载(重载就是通过传递不同类型的参数,使两个相同函数名的函数执行不同的功能 ...
- paip.编程语言方法重载实现的原理及python,php,js中实现方法重载
paip.编程语言方法重载实现的原理及python,php,js中实现方法重载 有些语言,在方法的重载上,形式上不支持函数重载,但可以通过模拟实现.. 主要原理:根据参数个数进行重载,或者使用默认值 ...
- [置顶] 在js中如何实现方法重载?以及函数的参数问题
都知道在js中没有办法直接实现方法重载,因为在js中如果定义了多个名称相同,但参数个数不一样的方法,其实只有最后一个方法能被真正调用,其他的方法都被覆盖掉了. 但每一个函数都有一个特殊的参数argum ...
- js中重载问题
在js中是没有重载的 但是 Arguments对象(可以实现模拟重载的效果) 利用arguments对象的length属性,可以获取函数接收的参数的个数 例如: function add(){ i ...
- js中的继承和重载
js中有三种继承方式:一.通过原型(prototype)实现继承 二.借用构造函数式继承,可分为通过call()方法实现继承和通过apply()方法实现继承 仅仅通过原型继承我们可以发现在实例化子 ...
- 从两个角度理解为什么 JS 中没有函数重载
函数重载是指在同一作用域内,可以有一组具有相同函数名,不同参数列表(参数个数.类型.顺序)的函数,这组函数被称为重载函数.重载函数通常用来声明一组功能相似的函数,这样做减少了函数名的数量,避免了名字空 ...
- js中arguments的用法
了解这个对象之前先来认识一下javascript的一些功能: 其实Javascript并没有重载函数的功能,但是Arguments对象能够模拟重载.Javascrip中国每个函数都会有一个Argume ...
随机推荐
- poj1696Space Ant(逆时针螺旋形)
链接 贪心做法,没次找最外面的点,也就是相对前面那条线偏转角度最小的点,除第一个点需要找到最下面的点即Y坐标最小,其余的每次进行极角排序. #include <iostream> #inc ...
- Java中HashMap案例
package ch8; import java.util.*; /** * Created by Jiqing on 2016/11/27. */ public class MapTest { pu ...
- 分享几个Javascript 封装方法
基本封装方法 请看下面的例子: var Person = function(name,age){ this.name = name; this.age = age || "未填写" ...
- 【ufldl tutorial】Softmax Regression
今天太长姿势了,什么叫懂了也写不出代码说的不就是我吗,就那么几行代码居然叽叽歪歪写了一个小时. 首先exercise要实现的是softmax的cost function和gradient,如下图: ( ...
- windows截屏
#ifndef _CAPTURESCREEN_H #define _CAPTURESCREEN_H #include <windows.h> class CaptureScreen { p ...
- servlet 文件上传简易版
package cn.itcast.servlet; import java.io.File;import java.io.IOException;import java.util.List; imp ...
- Java中this、super用法
这节我们主要是区分this 和 super这两个关键字的用法 起初我根本弄不清楚this 和 super这两个关键字的用法,也不明白在代码实例中为什么既用this又用super,下面就是原因: 1. ...
- Ubuntu安装nodeJS
安装环境 ubuntu12.04 64bit nodejs-v0.8.14.tar.gz Node.js是一个基于google v8+javascript的服务端编程框架.但是Node.js又不是js ...
- 二级菜单jquery
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- exit(0)和exit(1)区别
exit(0):正常退出程序: exit(1):非正常退出程序: return:返回. return是语言级别的,表示调用堆栈的返回: exit是系统调用级别的,表示一个进程的退出.