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