1

什么是最好的(性能,内存方面),以实现一种干净的方式来创建一个类或以某种方式正确地构造代码,共享 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...
  });
});
4

2 回答 2

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 = // ...
}
于 2012-08-21T20:34:20.513 回答
1

您是否打算重用routehandleAuthhandleRequestData函数?它们可能是 Client 构造函数的“私有”:

function Client(req, res) {
    function route() {
        //...
    }

    function handleAuth() {
        //...
    }

    function handleRequestData() {
        //...
    }

    route();
    handleRoute();
    handleRequestData();
}

看到我没有设置reqres作为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定义为最外圆括号中的函数表达式的乘积。函数表达式返回构造函数,它可以访问闭包函数routehandleRoutehandleRequestData。请注意,这些函数中的每一个都是使用reqres参数定义的。这样,它们的行为就像静态私有函数一样,您可以编码和使用它们,而不管this.

关于 self = this:众所周知,JavaScript 可能对this关键字非常困惑。这里有一些信息this因此,有时分配给一个名为 likeself或的闭包变量会很方便me。不过,它不应该盲目地做……毕竟。

于 2012-08-21T20:37:22.853 回答