我已经阅读了很多关于如何在node.js中创建模块的文章,你可以使用module.exports将模块内部公开给包含它的文件。真棒!
这是如何相反的?我将使用以下作为示例: - )
USER.JS
function User() {
this.property = 'value';
this.doSomething = function() {
var getStuff = mainFileFunction();
// do something with getStuff
}
module.exports = User;
MAIN.JS
var myArray = [];
myArray.push('something');
myArray.push('something else');
mainFileFunction() {
for(thing in myArray) {
return myArray[thing];
}
}
var u = new user();
log(u.property); <--- THIS IS EXPOSED, COOL!
u.doSomething(); <--- This will throw an error because mainFileFunction is not defined in user.js :-(
如果我要将mainFileFunction移动到用户文件,那么它仍然无法工作,因为myArray数组不会被定义...如果我也要移动它,我将无法在main(我想要)的其他函数中使用它: - )
如果我在这里遗漏了一些非常明显的东西,我很抱歉...我想要的是从我包含的模块中公开我选择的部分(module.export适用于此)但我也希望公开所有内容所有包含的主文件..
或者只是将所有东西暴露给所有东西?那是完全凌乱和可怕的吗?
只是为了解释我在这里尝试做什么...我希望在单独的文件中定义类,但是我想将它们实例化为主文件中的对象并将它们存储在数组中..我想要包含可以访问其他对象类型数组的方法的对象。
谢谢你们! : - )
答案 0 :(得分:7)
你可以使用全局变量,或者具有适当的循环依赖关系(require
两个文件),但是这通常是一个坏习惯,可能导致将来出现可维护性问题。
相反,您可以使用依赖注入并将doSomething
注入模块中。
这基本上免费提供以下内容:
User
的简单模拟实现测试doSomething
并验证代码的正确性我将提供两个实现,一个使用构造函数依赖注入,另一个使用模块范围设置。
USER.JS
function User(dependentFunction) {
this.property = 'value';
this.doSomething = function() {
var getStuff = dependentFunction();
// do something with getStuff
}
}
module.exports = User;
MAIN.JS
...
var u = new User(mainFileFunction);
u.doSomething(); // this will now work, using mainFileFunction
这里发生的事情非常简单,我们知道发生了什么。
这也可以是模块范围设置
USER.JS
function User(depFunc) {
this.property = 'value';
this.doSomething = function() {
var getStuff = depFunc();
// do something with getStuff
}
}
function UserFactory(depFunc){
return function(){
return new User(depFunc);
}
}
module.exports = UserFactory;
MAIN.JS
var getUser = UserFactory(mainFileFunction);
var u = getUser(); // will return a new user with the right function
答案 1 :(得分:1)
+1本杰明回答依赖注入。 我想通过在require中传递依赖项('。/ module.js')(dependentFunction)来添加另一种方法来在模块中注入对象;
//MAIN.js
var db = function() {
this.rows = [];
this.insert = function(name) {
this.rows.push(name);
console.log('Db: Inserting user with name ' + name);
}
this.getAll = function(){
return this.rows;
}
}
var fakeDb = new db();
var user = require('./user.js')(fakeDb);
user.add('Jhon');
user.add('Rose');
user.list();
和
//users.js
module.exports = function(db) {
return {
add: function(name) {
db.insert(name);
},
list: function() {
var users = db.getAll();
var i = users.length;
console.log('listing users\n-------');
while(i--) {
console.log(users[i]);
}
}
}
}
答案 2 :(得分:0)
您应该将mainFileFunction
作为参数传递给用户的构造函数。
USER.JS
function User(mainFileFunction) {
this.property = 'value';
this.doSomething = function() {
var getStuff = mainFileFunction();
// do something with getStuff
}
module.exports = User;
在你的main.js中使用以下
var u = new user(mainFileFunction);
答案 3 :(得分:0)
如何将mainFileFunction移动到user.js,并让函数接受一个数组作为参数:
mainFileFunction(array) {
for(thing in array) {
return array[thing];
}
}
然后当你从main.js调用它时,传递你的数组函数:
u.doSomething(myArray);