monkeypatch导出函数

时间:2016-03-18 17:15:14

标签: javascript node.js

nodev4 -

上运行

让我们说我有2个图书馆:foobar

foo有此

var bar = require('./lib/bar');
exports = module.exports = function myApp(options) {
 [snip]
}
exports bar = bar;

bar有此

module.exports = function doStuff(moreOptions) {
  function doMoreStuff () {
  }
}

我的应用

x = requires(foo); 

我想做的是将我的应用程序发送到monkeypatch doMoreStuff函数 - 这可能吗?

我尝试过各种各样的图书馆,但我怀疑我对js的理解存在根本问题;)

1 个答案:

答案 0 :(得分:0)

让我们看看你在这里有什么。之后

x = requires(foo);

你有以下基本上

x = function (options){ /* function work */ }
x.bar = function(moreOptions){
    function doMoreStuff(){
    }
}

这虽然不是非法的'这很奇怪。

相当于

a = function() { return "I'm a function"; }
a.bar = "I'm a string attached to a function";

console.log(a());   // => "I'm a function"
console.log(a.bar); // => "I'm a string attached to a function"

你的酒吧模块做得不多。它是一个包含无法访问功能的函数。假设你的意思是

module.exports = function(moreOptions){
    return {
        doMoreStuff: function(){
            return "Bar doing more stuff";
        }
    }
}

如果您想要新建一个myApp并附加外部功能,那么

function myApp(options){

}
myApp.prototype.bar = bar();        // since you exported a function
module.exports = myApp;

在您的主应用程序中,您现在可以

x = require('foo');

var app = new foo();    // you MUST otherwise you get an empty function
app.bar.doMoreStuff();  // => "Bar doing more stuff"

另外(并且不太容易出错)foo可能是

var bar = require('bar');
module.exports = function (options) {
  // work here ...
  return {
    bar: bar(),    // again, exported as function
    appOptions: options,
    // ...
  }
}

然后在主模块中

x = require('foo');
x.bar.doMoreStuff();   // => "Bar doing more stuff";

希望这有帮助。