Nodejs module.exports传递问题(突然发现的问题到现在还没找到原因,求解)
Nodejs module.exports传递问题(突然发现的问题到现在还没找到原因,求解)
分装了一个Obj对象(User.js)
User = function(){
var pri = {
id : null,
name : null
}
var pub = {
setId : function(id){
pri.id = id;
},
getId : function(){
return pri.id;
},
setName : function(name){
pri.name = name;
},
getName : function(){
return pri.name;
}
toData : function(){
return pri;
}
}
return pub;
}
module.exports = User;
\n```
### 外部引用这个Obj(UserT.js)
** 在这里直接require引用进来就ok了,
不需要使用定义var User = require("../modules/User");
var user = new User();
而是可以直接使用对象。why?
**
```js\n
require("../modules/User");
UserT = (function(){
var user = new User();
function UserT(){
}
UserT.prototype.init = function(){
user.setName("Michael");
}
UserT.prototype.getName = function(){
console.log("message");
}
});
module.exports = UserT;
\n```
### 比较奇怪的是下面的问题(Test.js)
**
在这边可以无需引用User就可以直接得到User对象???
Why?
**
```js\n
require("./UserT");
console.log(UserT);
console.log(User);
\n```
您的问题是关于 Node.js 中 module.exports 的传递机制,特别是在模块导出和引入时的一些行为。让我们来详细分析一下这个问题。
首先,您创建了一个名为 User.js 的模块文件,其中定义了一个构造函数 User,并将其导出为模块:
// User.js
User = function() {
var pri = {
id: null,
name: null
}
var pub = {
setId: function(id) {
pri.id = id;
},
getId: function() {
return pri.id;
},
setName: function(name) {
pri.name = name;
},
getName: function() {
return pri.name;
},
toData: function() {
return pri;
}
};
return pub;
};
module.exports = User;
在这个文件中,User 是一个构造函数,它返回一个包含公共方法的对象 pub,这些方法用于操作私有变量 pri。
接下来,您在 UserT.js 文件中导入了 User.js 并创建了一个新的构造函数 UserT,然后尝试通过 UserT 来实例化 User:
// UserT.js
require("../modules/User");
UserT = (function() {
var user = new User();
function UserT() {}
UserT.prototype.init = function() {
user.setName("Michael");
};
UserT.prototype.getName = function() {
console.log(user.getName());
};
});
module.exports = UserT;
这里需要注意的是,虽然 require("../modules/User") 导入了 User 模块,但并没有将 User 赋值给任何变量。这意味着 User 只在当前模块的作用域内可用,而不会暴露给其他模块。
最后,在 Test.js 文件中,您试图直接访问 UserT 和 User,但由于 User 未被正确暴露,所以会导致错误或未定义的行为:
// Test.js
require("./UserT");
console.log(UserT); // 正确输出 UserT 构造函数
console.log(User); // undefined
要解决这个问题,您需要确保 User 在 UserT.js 中被正确地暴露出来。可以通过修改 UserT.js 如下:
// UserT.js
const User = require("../modules/User");
UserT = (function() {
var user = new User();
function UserT() {}
UserT.prototype.init = function() {
user.setName("Michael");
};
UserT.prototype.getName = function() {
console.log(user.getName());
};
});
module.exports = UserT;
这样,User 将会在 UserT.js 中被正确导入,并且可以在其他模块中访问到 User 对象。
总结一下,关键点在于确保在需要使用 User 的地方正确导入它,并且在模块之间正确地传递和暴露所需的对象。
单require = 直接插入。
User.js定义的User函数没有var
// 由于var 被你吃了,所以User被定义到了global上
User = function(){.....}
// 这一行去掉也不会影响你的结果
// module.exports = User;
我去,换markdown引擎了??原来的``` 哪去了?换成什么了
111
全局惹的祸
从你的描述来看,User.js 文件中的 module.exports 设置了 User 函数,而你在 UserT.js 中通过 require 引入了 User.js 文件,但实际上没有使用 User 函数的实例,而是直接创建了一个新的 UserT 构造函数。
在 Test.js 中,你引入了 UserT.js 文件,并且直接使用了 UserT 和 User 变量。由于 UserT.js 文件中并没有对 User 进行导出或赋值,所以这里的 User 是未定义的。
为了更好地理解这个问题,可以重新组织一下代码结构,确保每个模块都正确地导出和引入所需的对象。
修改后的 User.js 文件
// User.js
const User = function() {
const pri = {
id: null,
name: null
};
const pub = {
setId(id) {
pri.id = id;
},
getId() {
return pri.id;
},
setName(name) {
pri.name = name;
},
getName() {
return pri.name;
},
toData() {
return pri;
}
};
return pub;
};
module.exports = User;
修改后的 UserT.js 文件
// UserT.js
const User = require("../modules/User");
const UserT = (function () {
let user = new User();
function UserT() { }
UserT.prototype.init = function () {
user.setName("Michael");
};
UserT.prototype.getName = function () {
console.log(user.getName());
};
return UserT;
})();
module.exports = UserT;
修改后的 Test.js 文件
// Test.js
const UserT = require("./UserT");
const userT = new UserT();
userT.init();
userT.getName(); // 输出 "Michael"
在这个修改后的版本中:
User.js正确导出了User函数。UserT.js通过require引入了User.js文件中的User函数,并正确创建了UserT构造函数。Test.js引入了UserT.js文件,并创建了UserT的实例,然后调用了init和getName方法。
这样可以确保每个模块都能正确地导入和使用所需的对象。

