实现创建类的一种干净方法或正确构造代码的方法最好(性能,内存方面),它共享2个具有合适对象大小的变量(req,res)。
是的,对于那些使用Node.js的人来说,它是req和res变量,但它是无关紧要的。
这是我到目前为止所尝试的:
function Client(req, res){
var self = this;
self.req = req;
self.res = res;
route.call(self);
handleRoute.call(self);
handleRequestData.call(self);
}
function route(){
var self = this;
self.req.route = // ...
}
function handleAuth(){
var self = this;
self.req.auth = // ...
}
function handleRequestData(){
var self = this;
self.req.data = // ...
}
我想知道它是否可以改进,因为我提到req和res是方法,属性相当不错的对象。既然.call(self)你通过实例,它会是最有效的方式吗?
我也不喜欢使用“var self = this;”一直都没用。
顺便说一句,我不想使用Coffeescript。
解决方案1.(由于大量传递req和res而失败)
让我们假设我们有文件 1。 client.js
var Client = {
route: function(req, res){},
auth: function(req, res, callback){ callback(req, res); },
getData: function(req, res, callback){ callback(req, res); } // async
}
文件 2。 main.js
var client = require('./client.js');
client.route(req, res); // fine because this is syncronous.
// This is where the problem is, massive passing through req and res parameters.
client.auth(req, res, function(req, res){
client.getData(req, res, function(req, res){
// Do something...
});
});
答案 0 :(得分:1)
我不知道为什么你一直在局部变量(this
)中保存上下文(self
)。您也可以一直使用this
,除非您需要将它带入具有不同范围的本地对象。
此外,您可以链接Prototype中的其他方法以访问其中的上下文:
function Client(req, res){
this.req = req;
this.res = res;
this.route();
this.handleRoute();
this.handleRequestData();
}
Client.prototype.route = function(){
this.req.route = // ...
}
Client.prototype.handleAuth = function(){
this.req.auth = // ...
}
Client.prototype.handleRequestData = function(){
this.req.data = // ...
}
如果您不想要“公开”方法,请执行以下操作:
function Client(req, res){
this.req = req;
this.res = res;
route.call(this);
handleRoute.call(this);
handleRequestData.call(this);
}
function route(){
this.req.route = // ...
}
function handleAuth(){
this.req.auth = // ...
}
function handleRequestData(){
this.req.data = // ...
}
答案 1 :(得分:1)
您是否打算重复使用route
,handleAuth
和handleRequestData
函数?它们可以是Client构造函数的“私有”:
function Client(req, res) {
function route() {
//...
}
function handleAuth() {
//...
}
function handleRequestData() {
//...
}
route();
handleRoute();
handleRequestData();
}
看到我没有将req
和res
设为this
成员。我不知道你的情况是否强制要求。而且,这只是可以做的事情的开始;如本答案的评论中所述,每次创建新的Client
时,也会创建私有函数的新实例,浪费资源。
更复杂的方法可以使用自调用函数表达式定义Client
:
var Client = (function() {
function route(req, res) {
//...
}
function handleAuth(req, res) {
//...
}
function handleRequestData(req, res) {
//...
}
// This is the constructor function:
return function(req, res) {
route(req, res);
handleRoute(req, res);
handleRequestData(req, res);
}
})();
这里,Client
被定义为最外括号中包含的函数表达式的乘积。函数表达式返回构造函数,该函数可以访问闭包函数route
,handleRoute
和handleRequestData
。请注意,这些函数中的每一个都使用req
和res
参数定义。这样,它们就像静态私有函数一样,无论this
引用什么,您都可以编码和使用它们。
关于self = this:众所周知,JavaScript可能会对this
关键字感到困惑。 Some information here。因此,有时将this
分配给名为self
或me
的闭包变量很方便。它不应该盲目地完成......毕竟......毕竟。