我试图在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 is not a 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);
有没有一种方法可以让我使用上面的自执行格式,并让我的模块导出构造函数?
在第二个示例中,您只是覆盖templateEngine
参数,这不会有任何效果。
要获得与第一个示例相同的结果,只需:
将module
传递到IIFE:
(function(module) {
})(module);
为其分配一个属性:
(function(module) {
var assert = require('assert');
var swig = require('swig');
module.exports = function (args) {
...
};
})(module);