Javascript NodeJS-如何在自执行函数中将构造函数分配给module.exports?

Javascript NodeJS-如何在自执行函数中将构造函数分配给module.exports?,javascript,node.js,constructor,self-executing-function,Javascript,Node.js,Constructor,Self Executing Function,我试图在NodeJS中的自执行函数中分配一个构造函数。我很确定它不起作用,因为我的参数是一个指向module.exports的变量,但我很好奇是否有办法让它在尽可能接近自动执行格式的情况下工作 下面是代码的调用方式 var TemplateEngine = require('./templateEngine'); templateEngine = new TemplateEngine({engine: 'swig'}); // "object is not a function" 下面是一个运

我试图在NodeJS中的自执行函数中分配一个构造函数。我很确定它不起作用,因为我的参数是一个指向module.exports的变量,但我很好奇是否有办法让它在尽可能接近自动执行格式的情况下工作

下面是代码的调用方式

var TemplateEngine = require('./templateEngine');
templateEngine = new TemplateEngine({engine: 'swig'}); // "object is not a function"
下面是一个运行良好的代码示例

var assert = require('assert');
var swig = require('swig');

// Constructor
var TemplateEngine = function(args) {
    assert.ok(args.engine, 'engine is required');
    var templateEngine = {};

    templateEngine.engine = args.engine;

    templateEngine.Render = function(templateString, model) {
        var result = swig.render(templateString, model);
        return result;
    };

    return templateEngine;
};

module.exports = TemplateEngine;
下面是我想使用的代码样式的一个示例,但它会产生一个“TypeError:Object不是函数”错误,因为我没有实际分配给module.exports,只是一个复制了它指向的任何对象的变量

(function(templateEngine) {
    var assert = require('assert');
    var swig = require('swig');

    templateEngine = function(args) {
        assert.ok(args.engine, 'engine is required');
        var templateEngine = {};

        templateEngine.engine = args.engine;

        templateEngine.Render = function (templateString, model) {
            var result = swig.render(templateString, model);
            return result;
        };

        return templateEngine;
    };
})(module.exports);

有没有一种方法可以让我使用上述自动执行格式并让我的模块导出构造函数?

在第二个示例中,您只是简单地覆盖
templateEngine
参数,这不会产生任何效果

要获得与第一个示例相同的结果,只需执行以下操作:

模块
传递到您的生活中:

(function(module) {

})(module);
将属性指定给以下对象:

(function(module) {
    var assert = require('assert');
    var swig = require('swig');

    module.exports = function (args) {
       ...
    };

})(module);

需要在第二个代码中指定module.exports,可能类似于module.exports=new templateEngine()?您必须使用许多templateEngine变量…不需要这种样式。您可以使用它来隐藏私有变量。。。但在客户方面。对于nodejs中的模块,没有分配给module.exports的所有内容都是私有的,所以这种模式是无用的。我同意它没有提供任何功能上的好处,但对组织来说非常好。您可以在parm中将module.exports命名为您想要的任何名称,如“controller”,然后将分配给controller.someProp=或controller.someFunction=的名称命名为您要导出的名称。我想你可以对一个对象做同样的事情,所以这更像是一种偏好。我意识到在导出构造函数时,所有这些都会丢失,所以在这种情况下,它可能毫无用处。哇。不知道为什么我没想到。我回家后会试试的,但我想这会很有效。谢谢你的回答!虽然这与我正在做的事情没有直接关系,但这确实有助于创建我的解决方案!