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

我无法理解以下两种风格是否有区别,哪一种更具有可比性,或者仅仅是视觉上的差异。

风格1 – 导出一个匿名函数,返回一个JavaScript对象的function作为属性

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 – 导出一个function的属性(老实说,我不明白为什么函数名称被用来作为回报)

 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; } 

也请解释第二种风格试图达到什么。

两者都不一样。

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

 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 

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

第一个版本每次都会返回一个全新的对象。 第二个版本每次都返回一个对同一个对象的引用,并覆盖对象的方法! 考虑下面的代码(我假定代码示例是一个名为“database-connector”的模块):

 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函数,并且可以直接调用来重写它们的方法。 我不相信这将是一个有用的function或是有意的。