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

开发 前端
重载函数指的是两个或两个以上的同名函数,实现一个函数名有多种功能。

面试官问你 JS 是如何实现函数重载的?你会怎么回答?

你会不会疑问我在书里看的明确讲 JS 是没有函数重载的,面试官说能实现,那肯定是有办法的呀,该如何实现呢?

一、什么是函数重载?

重载函数指的是两个或两个以上的同名函数,实现一个函数名有多种功能。

函数重载要求编译器能够在调用函数时唯一确定,应该调用的是哪个函数?由于同名函数有多个,在确定函数实现时,需要根据函数的参数的个数和类型来区分,即实现函数重载时,要求同名函数的参数个数或类型不一致,否则将无法实现函数重载。

重载的特点:

  • 同名的多个函数。
  • 不同的参数。

二、JS中有函数重载吗?

我在阅读《JavaScript 高级程序设计(第三版)》一书,在第五章看到明确的提示 JS 没有函数重载。

我们在 《JavaScript 高级程序设计(第三版)》 书中能看到,JS 中的同名函数,前面的会被最后面的函数覆盖掉,根本无法实现多种功能,如:

function add(a,b) {
 return a+b
}
function add(a, b, c) {
 return a + b + c
}
console.log(add(1,2)); // NaN
console.log(add(1,2,3 ));// 6
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.

如果我们需要使用 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)) //3
console.log(add(1, 2, 3)) //6
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.

上述方法虽然实现了上述简单功能,勉强能算得上是一种函数重载的实现方法,但是存在一定的弊端。

它的缺点:

  • 如果功能复杂时,代码量过大。
  • 不利于维护和复用。

这时候问题来了,利用 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)
  }
 }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.

上述方法用来给一个对象添加自定义方法,能够接收三个参数:

  1. 需要添加方法的对象
  2. 自定义方法名
  3. 定义方法具体要实现的功能,通过回调实现
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)

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.

总结:JS 没有函数重载,但是可以实现函数重载。

责任编辑:姜华 来源: 今日头条
相关推荐

2023-04-14 15:44:20

TypeScrip函数重载

2010-01-20 17:48:07

C++ 函数重载

2010-01-18 16:56:30

C++函数

2009-07-31 16:00:30

C#函数重载

2011-03-14 10:47:30

HashMap

2011-07-20 17:16:50

C++重载函数

2022-01-04 19:21:04

函数TypeScript重载

2010-02-05 15:59:26

C++函数重载

2021-12-10 09:11:36

TypeScript 函数重载 TS 前端

2009-09-01 11:28:32

C#使用函数重载

2022-09-02 17:07:46

C语言main()

2022-04-11 19:55:26

函数类型函数重载

2009-05-26 09:31:00

C++重载覆盖

2016-12-26 09:23:18

C++函数覆盖

2010-01-11 15:21:18

C++语言

2024-04-15 12:54:40

2010-02-04 09:26:23

C++模板函数重载

2022-04-13 21:07:30

Vue 3函数重载

2024-03-21 10:48:21

JS重载Java

2022-07-04 08:54:39

Swift处理器项目
点赞
收藏

51CTO技术栈公众号