构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。