一、问题描述:
class myClass{
A(){};
A(arg){}
}
编译为ES5标准的时候,变成 myClass.prototype.A= function (){} myClass.prototype.A= function (arg){}
结果就是,所有调用A的地方,无法参数个数是否相同,都是执行A(arg)那个,因为后面的那个同名函数覆盖了前一个同名函数。
其实,不只是ES6的class中,ES5中的语法也有这种问题。
也就是: js中只要函数名形同,后加载的函数会覆盖先加载的函数,无参数有无或参数多少无关。
二、 解决方法:
思路: 作用域 (方法三,四)和 避免同名 (方法二,一)两方面来解决问题。
方法一:一个函数,内部判断参数个数
js没有重载,因此需要做判断。
function hello(userName,age){ if(arguments.length==2){ alert("我是带2个参数的hello(userName, age)函数!" + " - " + userName + " - " + age); }else if(arguments.length==1){ alert("我是带1个参数的hello(userName)函数!" + " - " + userName); }else if(arguments.length==0){ alert("我是无参数的hello()函数!"); } }
其实js的函数就是一个变量(除了存在变量提升),因此如果你在你的代码最后加上
hello="改成字符串";
,再执行hello()
就会报错,因为hello现在是个字符串而不是函数。
方法二: 协同命名
多人开发项目中,大家提前协商好命名规范,或者按照功能来命名。
方法三:对象命名空间
命名空间,就是我们创建一个对象,把该对象作为一个命名空间,我们可以通过对象-属性或者对象-方法来创建或者获取一个变量或者函数。每个对象都是相互独立的,这样只要每个人定义不同的命名空间,就避免命名冲突。
方法四:匿名函数
当我们在函数里面定义变量的时候,该变量的作用域就是在该函数的内部,这时我们无法在函数外部访问到该变量,我们每个人在不同的函数内部定义变量,即使变量名字相同,也不会相互干预。
参考博客:【JavaScript避免重命名的方法】