我无法理解以下两种风格是否有任何区别,哪种风格更易于处理,或者它们在视觉上是不同的。
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;
}
另外请解释第二种风格试图实现的目标。
答案 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.getAByB
或db1Connection.getName
,则将使用db2Logger和db2,因为db2Connection的初始化覆盖了db1Connection的方法。
另一个区别是,对于模块的第二个版本,db1Connection和db2Connection也都等于databaseConnector函数,可以直接调用以再次覆盖它们的方法。我不相信这将是一个有用的功能或是有意的。