返回具有相同属性的函数对象或匿名对象

时间:2014-09-26 08:12:52

标签: javascript node.js

我无法理解以下两种风格是否有任何区别,哪种风格更易于处理,或者它们在视觉上是不同的。

STYLE 1 - 导出一个匿名函数,该函数返回一个带有函数作为属性的javascript对象

module.exports = function(logger,db,config){

    return {
        getAByB : function(b,cb){
            logger.log(b);
            cb(undefined,'someting');
        },


        getName : function(cb){
             db.fetch(function(res){
                 cb(res)
             });
        }
    }
}

样式2 - 导出具有属性的函数(老实说,我不明白为什么使用函数名称作为回报)

module.exports = function Something(logger,db,config){

        Something.getAByB = function(b,cb){
            logger.log(b);
            cb(undefined,'someting');
        }


        Something.getName = function(cb){
             db.fetch(function(res){
                 cb(res)
             });
        }

        return Something;
}

另外请解释第二种风格试图实现的目标。

2 个答案:

答案 0 :(得分:0)

两者相同。

第一个将使用您指定的方法和属性创建一个新对象。这只能作为返回值访问。

var x = module.exports(1, 2, 3); // Object {getAByB: function...
console.log( module.exports.getAByB ); // undefined
module.exports(1, 2, 3).getAByB(4, 5); // works

第二个将所有方法设置为module.exports方法本身的可链接调用以及可立即链接的对象:

var y = module.exports(1, 2, 3); // function Something...
console.log( module.exports.getAByB ); // function getAByB...
module.exports(1, 2, 3).getAByB(4, 5); // works

答案 1 :(得分:0)

两个版本都返回一个带有(logger,db,config)参数的函数,然后使用getAByB和getName方法返回一个值。但是,存在潜在的重要差异。

第一个版本每次都返回一个全新的对象。第二个版本每次都返回对相同对象的引用,并覆盖对象的方法!请考虑以下代码(我假设代码示例是一个名为&#34的模块;数据库连接器"):

var databaseConnector = require("database-connector");

var db1Logger = console.log.bind(console, "Db1 log:");
var db1 = ...;
var db1Connection = databaseConnector(db1Logger, db1, {});

var db2Logger = console.log.bind(console, "Db2 log:");
var db2 = ...;
var db2Connection = databaseConnector(db2Logger, db2, {});

使用该模块的第一个版本,这将正常工作。但是,使用代码的第二个版本,db1Connection和db2Connection都将是相同的值!如果您调用db1Connection.getAByBdb1Connection.getName,则将使用db2Logger和db2,因为db2Connection的初始化覆盖了db1Connection的方法。

另一个区别是,对于模块的第二个版本,db1Connection和db2Connection也都等于databaseConnector函数,可以直接调用以再次覆盖它们的方法。我不相信这将是一个有用的功能或是有意的。