即使我使用面向对象的语言(C ++,C#,AS3)编程,JS的形式基本用法仍然存在一些问题。
我需要做的是使模块中的一个功能可访问。在nodeJS中导出。
我有这个auth.js文件,里面有一个函数:
module.exports = function(app,passport,pg,user,razza){
var Pg = pg;
var User = user;
var Razze = razza;
updatePgXP: function (){
console.log("!!!!!!!!!!!!!Add XP!!!!!!!!!!!!!");
}
//....and the story goes on...
}
我想像这样在我的server.js中调用updatePgXP()
:
var authRoute = require('./app/routes/auth.js')(app,passport,models.pg,models.user,models.razze);
//doing stuff, and at some point...
io.sockets.on('connection', function(socket){
socket.on('send message', function(data){
authRoute.updatePgXP();
}
}
一切正常,我只是想不出如何从外部访问auth.js内部的函数。它需要留在导出模块内部,因为它将需要在module.export之后在顶部声明的变量进行操作。
此刻,当我调用函数updatePgXP()
时会引发未定义的错误。
非常感谢任何人都可以提供帮助。
答案 0 :(得分:0)
您必须导出对象而不是会暴露这些功能的功能。
您还可以使用适当的构造函数创建一个类,该类将允许您以面向对象的方式对这些变量进行操作:
module.exports = function MyClass(app,passport,pg,user,razza){
this.pg = pg;
this.user = user;
this.razza = razza;
}
MyClass.prototype.updatePgXP = function (){
// Note "this" here:
console.log(this.pg);
console.log("!!!!!!!!!!!!!Add XP!!!!!!!!!!!!!");
}
// This is how you instantiate it somewhere else:
const myClassInstance = new MyClass(app,passport,pg,user,razza);
myClassInstance.updatePgXP();
如果您使用的是ES6,则可以使用适当的类构造:
module.exports = class MyClass {
constructor(app,passport,pg,user,razza){
this.pg = pg;
this.user = user;
this.razza = razza;
}
updatePgXP() {
// Note what's inside "this" here:
console.log(this.pg);
console.log("!!!!!!!!!!!!!Add XP!!!!!!!!!!!!!");
}
}
// Instantiation is the same:
const myClassInstance = new MyClass(app,passport,pg,user,razza);
myClassInstance.updatePgXP();
有关JS类的更多信息: