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

Tim*_*rdy 6 javascript constructor node.js self-executing-function

我正在尝试在NodeJS中的自执行函数中分配构造函数.我很确定它不起作用,因为我的参数是一个指向module.exports的变量,但我很好奇是否有办法使其工作,同时保持尽可能接近自执行格式.

这是代码被调用的方式......

var TemplateEngine = require('./templateEngine');
templateEngine = new TemplateEngine({engine: 'swig'}); // "object is not a function"
Run Code Online (Sandbox Code Playgroud)

这是一个很好的代码示例...

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;
Run Code Online (Sandbox Code Playgroud)

这里是我想要使用的代码样式的一个例子,但它产生了一个"TypeError:Object is not function"错误,因为我实际上并没有分配给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);
Run Code Online (Sandbox Code Playgroud)

有没有办法让我使用上面的自执行格式并让我的模块导出一个构造函数?

JLR*_*she 9

在你的第二个例子中,你只是覆盖templateEngine参数,这不会有任何影响.

要获得与第一个示例相同的结果,只需:

传递module到您的IIFE:

(function(module) {

})(module);
Run Code Online (Sandbox Code Playgroud)

为此分配属性:

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

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

})(module);
Run Code Online (Sandbox Code Playgroud)