构build一个NodeJS模块 – variables和方法

我想创build模块来构build我的NodeJS应用程序,但我有点迷路,而且我还没有发现任何东西(有几个小时的search),这是完全明确的主题。

说我想创build一个“用户”模块,从中我可以创build新的用户在我的代码使用类似于:

var newUser = new User(); 

理想情况下,我需要使用类似于我的代码顶部的模块:

 var User = require('../lib/user'); 

这很好。 问题是,我应该如何构build用户模块? 以下是最好的方法吗?

 module.exports = function User() { var authorized = false; var username = undefined; var password = undefined; var statistics = undefined; this.authorized = function() { return authorized; } this.username = function() { return username; } this.statistics = function() { return statistics; } } 

我正在写我的各种模块variables的getter和setter,允许我隐藏我不希望从其他代码中意外访问的内容。 不过,我之前这样做过:

 function User() { this.authStatus = false; this.email; this.displayName; this.inSession; } User.prototype.isAuthenticated = function() { return(this.authStatus && this.email && this.displayName) } User.prototype.isInSession = function() { return(this.inSession && this.isAuthenticated()); } exports.User = User; 

这也有效,只有一个警告。 我还没有find一种方法来访问closures内的用户属性。 如果我的理解是正确的,在第二次执行时,我不能。 这意味着如果我需要把一个函数closures到一个数据库库作为callback来编辑用户的属性,我不能。 这看起来像这样:

 User.prototype.login = function() { db.doDbStuff('get user data query', function(_error, _result) { this.username = _result[0].name; //this code will not work }); } 

根据我的理解,该代码不起作用,因为“this”关键字在closures的范围内,而不是用户。 即使代码被放置在用户function中:

 function User() { this.login = function() { //you know 

这是行不通的。

我想我的问题是,这个问题最好的解决办法是什么? 这是我在第一个代码块中呈现的方法吗? 这似乎相当繁琐和混乱,并容易发生变化的碰撞。 我很害怕。

提前致谢!

我通常采用第二种方法,将function附加到原型上。

variables“不可用于闭包”的问题与原型无关。 无论你如何构造它,你都会遇到同样的问题。

这是与JavaScript的经常混淆的dynamic: http : //robotlolita.me/2011/10/09/understanding-javascript-oop.html#sec-2-1

基本上,你需要做一些事情:

 User.prototype.login = function() { var self = this // bind this to self so you have a reference to what `this` was db.doDbStuff('get user data query', function(_error, _result) { self.username = _result[0].name; // self refers to the original `this`, so this works. }); } 

你也可以select使用function.bind: https : //developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/bind

在绑定函数中,这个值将是您提供给.bind(value)任何值:

 User.prototype.login = function() { db.doDbStuff('get user data query', (function(_error, _result) { this.username = _result[0].name; // bind fixes the original `this`, so this also works. }).bind(this)); } 

无论你使用function.bind还是self = this都是个人品味问题,但是我们在前一天在freenode#nodejs中做了一些基准testing,发现bind()var self = this要慢20倍。

至于你如何构build模块的原始问题,有很多例子可以从github学习。 只需find你喜欢的模块,并检查它们的结构。 我注意到很多人似乎更喜欢工厂直接暴露构造函数(例如require('module').create() )。 你的来电。

作为一个不同的方法,我是以下模式的粉丝。

 module.exports = function User(data){

     //这适当的私人的东西。

     var privateVar;
     var username = data.username;
     var pass = data.pass;  //等等

    函数privateFunc(){
     }

    返回{
         login:function(cb){
             db.doStuff(username,pass,cb);
         }
     };
 };
 User.prototype.login = function() { var _this = this; db.doDbStuff('get user data query', function(_error, _result) { _this.username = _result[0].name; //this code will now work }); } 

你用的'this'超出了它的范围,这是'this'的callback。