如何将此传递给NodeJS中的require()?

时间:2014-07-18 22:53:43

标签: node.js module this

将thisArg传递给require()d模块的最佳方法是什么?

我想做这样的事情:

index.js

function Main(arg) {
    return {
        auth: auth,
        module: require('/some/module')
    }
}

module.js

module.exports = {
    someMethod: function() {...}
}

然后,在我的代码中我调用Main(),它返回对象。 所以Main()。auth存在,很酷。但是如何从Main()。模块访问它? Main()。module.someMethod()中的thisArg指向模块本身..但我需要父级。

如果不使用新的关键字,函数和原型,有没有办法做到这一点?

编辑:

感谢所有答案!一些额外的信息:

Main()是我想要的模块()并在我的应用程序中使用。 "模块" Main尝试导入实际上只是Main的子功能,它只是代码的一部分,我移动到一个单独的"模块"更好地组织代码。

更好的例子是:

function RestApi(param) {
    return {
        common_param: param,
        commonFunc: function() {...}
        endpoint1: require('/some/module'),
        endpoint2: require('/some/module2'),
        endpoint3: require('/some/module3')
    }
}

我的应用会像这样使用它:

RestApi = require('./RestApi')
RestApi().endpoint1.someHTTPCall(...)

但在someHTTPCall()中," common_param"和" commonFunc"应该可以通过thisArg访问,例如this.commonFunc()。

所以这是一个普遍的问题,你如何正确地使用require()合并多个模块,所以"这个"会指向正确的对象(即:父母)

我知道这可以使用Function.prototype和继承来实现,只是想知道是否有更简单的方法。

到目前为止我发现的最好的是这样的:

var _ = require('lodash');

function Module(auth) {
    this.auth = auth || {};
}

Module.prototype = {
    endpoint1: function() { return _.extend(require('./endpoint1'),{auth: this.auth, commonFunc: commonFunc})}
}

function commonFunc() {...}

然而,这并不理想,因为RestApi.endpoint1()会在每次调用时创建一个新对象。

有没有更好的方法来解决这个问题?

提前致谢!

2 个答案:

答案 0 :(得分:0)

您可以更改模块以返回功能,如下所示:

// some/module.js
module.exports = function(mainModule) {
  var main = mainModule;

  return {
    someMethod: function() {
      main.doSomethingElse();
    }
  }
}

然后require传递main对象:

function Main(arg) {
  var main = {
    auth: auth,
    other: stuff,
  };

  main.module = require('/some/module')(main);

  return main;
}

答案 1 :(得分:0)

使用auth param创建自己的“require”模块并始终使用它。

项目/模块/ requirejs

module.exports = function(path, auth){
    if (!check(auth))
        return null
    return require(path)
}