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
如果我们需要使用 JS 实现上述 add 方法,将两个或三个数值进行求和,该怎么解决呢?
解决1:利用 argumentsfunction 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
上述方法虽然实现了上述简单功能,勉强能算得上是一种函数重载的实现方法,但是存在一定的弊端。
它的缺点:如果功能复杂时,代码量过大。不利于维护和复用。
这时候问题来了,利用 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 没有函数重载,但是可以实现函数重载