Javascript类传递参数

时间:2015-03-29 13:54:05

标签: javascript

我一直在创建几个类,但我从来没有在类本身上有任何所需的参数。

以下代码完美无缺。

$(function()
{
   search.anotherFunction('a', 'b');
});

search = function()
{

   this.anotherFunction = function(param1, param2)
   {
      // do whatever
   };

   var public = { anotherFunction: anotherFunction }  

   return public;
}();

但是现在我想在search内传递参数,以避免将相同的参数传递给所有函数。

$(function()
{
   search('front/file.php').anotherFunction('a', 'b');
});

search = function(url)
{

   this.anotherFunction = function(param1, param2)
   {
      // use here the 'url' parameter
   };

   this.anotherFunctionB = function(param1, param2)
   {
      // use here the 'url' parameter
   };

   var public = { anotherFunction: anotherFunction,
                  anotherFunctionB: anotherFunctionB }  

   return public;
}();

这不起作用,控制台输出错误。

  

未捕获的TypeError:对象不是函数

这意味着search不是函数,而是类名,因此无法接收参数?

2 个答案:

答案 0 :(得分:3)

首先,您创建"类的方式"是不正确的,最终创建全局变量:在对匿名函数的调用中,由于你调用它的方式,this将引用全局对象*,因此this.anotherFunction = ...将创建一个全局变量名为anotherFunction,因为全局对象上的属性是全局变量。

如果您希望在最少的更改时继续使用当前模式,那么请不要将this.xyz = ...用于您的功能,而是使用var

var search = function()
{
   var anotherFunction = function(param1, param2)
   {
      // do whatever
   };

   var public = { anotherFunction: anotherFunction }  

   return public;
}();

另请注意,由于未声明search,您成为The Horror of Implicit Globals的牺牲品;我添加了var来声明它。

如果您没有调用最外层函数并将函数分配给search变量,那么您的第二个示例(上述更改)将会起作用,然后稍后调用它:

var search = function(url)
{

   var anotherFunction = function(param1, param2)
   {
      // use here the 'url' parameter
   };

   var anotherFunctionB = function(param1, param2)
   {
      // use here the 'url' parameter
   };

   var public = { anotherFunction: anotherFunction,
                  anotherFunctionB: anotherFunctionB }  

   return public;
}; // <== Note, no () here

现在search指的是一个函数,我们可以这样调用:

var x = search("http://example.com");
x.anotherFunction(...); // Will have access to the URL

*为什么在调用匿名函数时this引用全局对象?因为您在没有做任何事情的情况下调用它来将this设置为其他内容,并且您正在使用松散模式。 (我知道您正在使用宽松模式,因为如果您使用严格模式,this将为undefined,因此this.anotherFunction = ...会失败。)


附注:我建议您停止使用public作为变量名称,因为它是future reserved word并且至少已经是ES3。

答案 1 :(得分:0)

您可以在此处使用JavaScript闭包。看看下面的方法:

search = function()
{
    return function (url) {
       this.anotherFunction = function(param1, param2)
       {
          // use here the 'url' parameter
       };

       this.anotherFunctionB = function(param1, param2)
       {
          // use here the 'url' parameter
       };

       var public = { anotherFunction: anotherFunction,
                      anotherFunctionB: anotherFunctionB }  

       return public;
    }
}();

search('front/file.php').anotherFunction('a', 'b');