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```

5 回复

您的问题是关于 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 文件中,您试图直接访问 UserTUser,但由于 User 未被正确暴露,所以会导致错误或未定义的行为:

// Test.js
require("./UserT");
console.log(UserT); // 正确输出 UserT 构造函数
console.log(User);  // undefined

要解决这个问题,您需要确保 UserUserT.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 文件,并且直接使用了 UserTUser 变量。由于 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"

在这个修改后的版本中:

  1. User.js 正确导出了 User 函数。
  2. UserT.js 通过 require 引入了 User.js 文件中的 User 函数,并正确创建了 UserT 构造函数。
  3. Test.js 引入了 UserT.js 文件,并创建了 UserT 的实例,然后调用了 initgetName 方法。

这样可以确保每个模块都能正确地导入和使用所需的对象。

回到顶部