JS 中没有函数重载,又是如何实现函数重载的呢?

一、什么是函数重载?
同名的多个函数。 不同的参数。 
二、JS中有函数重载吗?

我们在 《JavaScript 高级程序设计(第三版)》 书中能看到,JS 中的同名函数,前面的会被最后面的函数覆盖掉,根本无法实现多种功能,如:
function add(a,b) {return a+b}function add(a, b, c) {return a + b + c}console.log(add(1,2)); // NaNconsole.log(add(1,2,3 ));// 6
如果我们需要使用 JS 实现上述 add 方法,将两个或三个数值进行求和,该怎么解决呢?
解决1:利用 arguments
function add() {var reg = arguments;if (reg.length == 2) {return reg[0] + reg[1]} else if(reg.length == 3) {return reg[0] + reg[1] + reg[2]}}console.log(add(1, 2)) //3console.log(add(1, 2, 3)) //6
上述方法虽然实现了上述简单功能,勉强能算得上是一种函数重载的实现方法,但是存在一定的弊端。
它的缺点:
如果功能复杂时,代码量过大。
不利于维护和复用。
这时候问题来了,利用 JS 如何实现呢?可以通过闭包的形式可以简单地实现。
三、JS 如何实现重载?
function addMethodToObject (obj, name, fn) {const temp = obj[name]obj[name] = function () {if (fn.length === arguments.length) {return fn.apply(obj, arguments)} else if (typeof temp === 'function') {return temp.apply(obj, arguments)}}}
上述方法用来给一个对象添加自定义方法,能够接收三个参数:
需要添加方法的对象
自定义方法名
定义方法具体要实现的功能,通过回调实现
addMethodToObject(group, 'find', function () {return {peoples: this.peoples,count: this.peoples.length}})addMethodToObject(group, 'find', function (isMale) {if (!!isMale) {const male = this.peoples.filter(item => item.sex === 'male')return {peoples: male,count: male.length}} else {const female = this.peoples.filter(item => item.sex === 'female')return {peoples: female,count: female.length}}})addMethodToObject(group, 'find', function (elder, age) {if (!!elder) {const elder = this.peoples.filter(item => item.age >= age)return {peoples: elder,count: elder.length}} else {const younger = this.peoples.filter(item => item.age < age)return {peoples: younger,count: younger.length}}})const group = {total: 10,male: 6,female: 4,peoples: [{age: 12,sex: 'male'}, {age: 18,sex: 'female'}]}group.find()group.find(1)group.find(0, 15)
总结:JS 没有函数重载,但是可以实现函数重载。
学习更多技能
请点击下方公众号
![]()

评论
