JS函数原型脱离上下文节点表达

时间:2013-05-31 09:51:39

标签: javascript node.js oop

我在使用带有上下文的节点中使用原型时遇到了问题。

/**
 * Constructor.
 * 
 * @param   object  opts        The options for the api.
 * @param   object  config      The application's configuration.
 * @param   object  db          The database handler.
 * @return  void
 */
var clientModel = function ( opts, config, db )
{
    this.opts = opts;
    this.config = config;
    this.db = db;
};

/**
 * Get a list of items.
 * 
 * @param   function    cb  Callback function.
 * @return  void
 */
clientModel.prototype.getList = function( cb )
{
    this.db.query(
        "SELECT FROM " + this.db.escape("client"),
        function ( err, rows, fields )
        {
            if( err.code && err.fatal )
            {
                cb(
                {
                    message: "SQL error locating client."
                });
                return;
            }

            if(! rows.length )
            {
                cb(
                {
                    message: "Unable to locate client."
                });
                return;
            }

            cb( false, rows, fields );
        });
};

/**
 * Default http request for getting a list of items.
 * 
 * 
 * @param   object  req     The http request.
 * @param   object  res     The http response.
 * @return  void
 */
clientModel.prototype.httpGetList = function ( req, res )
{
    this.getList( function ( err, rows, fields )
    {
        res.end("Got a list");
    });
}


// - Append model to output.
module = module.exports = clientModel;

基本上节点表达框架调用httpGetList并且“this”没有getList,因为“this”由于上下文而表达,有没有办法改进我的代码才能正确地做到这一点,我猜它是否有到this.getList然后this.db也会脱离上下文?

任何帮助表示感谢。

2 个答案:

答案 0 :(得分:2)

您可以将函数绑定到一个对象,这样无论它们如何被调用,this都将如您所愿。您可以找到更多信息here

您可以绑定构造函数中的方法。下划线库有一个有用的bindAll方法来帮助你。

答案 1 :(得分:1)

我建议你在模块中创建实例并导出处理请求的函数。

/**
 * Exports.
 * 
 * @param   object  opts        The options for the api.
 * @param   object  config      The application's configuration.
 * @param   object  db          The database handler.
 * @return  void
 */
module = module.exports = function ( opts, config, db )
{
    var instance = new clientModel( opts, config, db );

    return {
        /**
         * Default http request for getting a list of items.
         * 
         * 
         * @param   object  req     The http request.
         * @param   object  res     The http response.
         * @return  void
         */
        httpGetList : function ( req, res )
        {
            instance.getList( function ( err, rows, fields )
            {
                res.end("Got a list");
            });
        }

    };
};