2016-08-03 60 views
1

有没有一种方法可以以与构造函数相同的方式将参数传递给模块?模块模式中的构造函数参数

我已经能够找到的答案似乎暗示了一个setter函数。这对我不起作用,因为我的模块的逻辑取决于设置的全局变量,如果没有使用依赖于“未设置”变量的代码实例化模块,则无法调用setter。

具体而言,我试图'模块化'一个D3图通常是有用的,并希望能够实例化模块与数据数组参数。

编辑:对于d3图,事实证明模块模式效果最好。没有什么是需要与不能只在后面的更新功能通过一个数据参数进行实例化......

但是总体来说,如果我有这个模块:

var thing = (function() { 

var a = [1,2,3]; 
var l = a.length; 

var doit = function() { 
    console.log('your array has '+l+' elements'); 
} 
var doit2 = function() { 
    console.log('your array contains: '+a.toString()); 
} 
return { 
    doit: doit, 
    doit2: doit2 
    } 
})(); 

如何传递的数组用来代替var a?

+0

'VAR的事情=(函数(PARAM){VAR一个=参数;/*等* /})(dataArray);'? – nnnnnn

+0

*'如果没有使用依赖于“un-set”变量的代码来实例化模块,则无法调用setter *。* - 在您的示例模块中,添加'.init()'或setter方法不会有任何问题。您可以将'a'默认设置为空数组,并将其设置为'.init()'或setter方法中的* real *值,如果客户端代码尝试调用'doit()'而不调用' .init()'然后它会得到它应得的。 – nnnnnn

+0

如果它是一个模块,一个静态的全局单例,那么将它作为参数传递给IIFE还是简单地将其放入body中并没有什么区别。如果您希望它可以重新使用,请改为使用工厂或构造函数。 – Bergi

回答

1

你可以做这样的事情(注意IIFE释放):

var thingCreator = function (param) { 
    // your code 
    return { 
     // your module object 
    }; 
}; 

然后调用它像:

var thing = thingCreator(a); 
+0

我认为这可能工作,这真的只是一个工厂功能? – oraz

+0

这只是一个工厂功能。您也可以将参数传递给IIFE,具体取决于您何时需要提供的值。 – Michael

相关问题