在javascript中覆盖函数

时间:2015-10-12 13:28:54

标签: javascript

所以我有js文件,用以下方法:

var DBProcessing = function()
{
console.log("ok")
...
}

var DBProcessing = function(str)
{
console.log(str);
...
}

在致电DBProcessing()时,我正在打印undefined

有没有办法显式调用方法而没有签名中的变量?

3 个答案:

答案 0 :(得分:6)

修改函数itelf以有条件地设置str

var DBProcessing = function(str)
{
str = str || 'ok';
console.log(str);
...
}

Javascript与强类型语言不同,您必须在其中提供有关参数数量和类型的具体方法签名。

在传统的强类型语言中,您可以实现方法重载,如

public void OverloadedMethod()
{
}

public void OverloadedMethod(int id)
{
}

public void OverloadedMethod(int id, int age)
{
}

你必须在论证的数量和类型方面非常具体。

在javascript中,没有这样的方法声明,你只能用接受变量类型/数量输入的方法真正声明一个方法 signature 。方法本身取决于如何处理这些参数。

function JSMethod(id, age){
    console.log(id);
    console.log(age);
}
JSMethod();
//outputs 'undefined', 'undefined'
JSMethod(1);
//outputs 1, 'undefined'
JSMethod(1, 26);
//outputs 1, 26

好的,如果你通过第三个参数怎么办?你可以做到

function JSMethod(id, age){
    console.log(id);
    console.log(age);
    console.log(arguments[2]);
}

JSMethod(1, 26, 99);
//outputs 1, 26, 99

这是因为每个方法都有一个arguments对象,其中包含被调用者提供的所有传递参数。

但是,最佳实践要求您尽可能清楚地使用您的方法。因此,虽然javascript方法可以接受变量类型/数量的参数,但最好将它们声明并设置为默认值(如果需要)

function JSMethod(id, age){
    id = id || 1;
    age = age || 16;
}

答案 1 :(得分:3)

定义参数但不要传递。您可以通过以下方式完成:

    var DBProcessing = function(str)
    {
       if(str !== undefined){
          // Things to do when str is passed
       } else {
       // Things to do when str is not passed
       }
    }

答案 2 :(得分:2)

为您的示例使用以下模式。如上所述,您只能声明一次函数语句 - 否则最后一个函数语句将优先。建议查看与javascript中方法重载相关的更多示例,尤其是与arguments和类型检查相关的。

var DBProcessing = function(str){
   if(arguments.length===0) {
      console.log("ok")
   }
   else{
      console.log(str);
   }
}