Javascript有效的代码结构

时间:2012-08-21 20:23:30

标签: javascript oop javascript-objects

实现创建类的一种干净方法或正确构造代码的方法最好(性能,内存方面),它共享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...
  });
});

2 个答案:

答案 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)

您是否打算重复使用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关键字感到困惑。 Some information here。因此,有时将this分配给名为selfme的闭包变量很方便。它不应该盲目地完成......毕竟......毕竟。