NodeJ用字符串引用对象

时间:2016-07-14 16:52:48

标签: javascript node.js

在运行时,我需要使用一个字符串'TEST1'并获取对同名对象的引用。

使用modules.export和require创建对象。我的尝试:

var TEST1 = require("./test1.js");
var TEST2 = require("./test2.js");

//TEST1.DoThings() is a function that exists now
//TEST2.DoThings() is a function that exists now


function DoIt(str){
    var obj = global[str];
    obj.DoThings() 
}

DoIt("TEST1") // fails
DoIt("TEST2") // fails

如何通过仅使用字符串作为输入来调用任一函数?

2 个答案:

答案 0 :(得分:0)

在浏览器中,顶级范围是全局范围。这意味着在浏览器中,如果您处于全局范围内,var会定义一个全局变量。在Node.js中,这是不同的。顶级范围不是全球范围; Node.js模块中的var内容将是该模块的本地内容。请改用以下代码

global.TEST1 = require('./test1.js');
global.TEST2 = require('./test2.js');


function DoIt(str){
var obj = global[str];
obj.DoThings();
}

DoIt('TEST1');
DoIt('TEST2');

修改

由于编辑全局对象是不好的做法,您可以使用两种不同的方式解决它。第一种方法是创建变量,您将使用字符串存储导入的模块和其他要访问的对象。

var imps = {};
imps.TEST1 = require('./test1.js');
imps.TEST2 = require('./test2.js');

function DoIt(str){
var obj = imps[str];
obj.DoThings();
}

DoIt('TEST1');
DoIt('TEST2');

第二种方法是覆盖require函数将所有导入的模块存储到imps变量中(当然,如果要添加imps变量以外的其他内容,则需要执行此操作就像在第一个例子中一样。)

var imps = {};
require = function(a){
    return function(b, c){
        imps[b] = a(c);
    };
}(require);

require('TEST1', './test1.js');
require('TEST2', './test2.js');

function DoIt(str){
var obj = imps[str];
obj.DoThings();
}

DoIt('TEST1');
DoIt('TEST2');

答案 1 :(得分:0)

执行此操作的最佳方法是将这些对象存储在另一个对象中并以这种方式引用它们。

var imports = {
  TEST1: { // in your case, do require('./test1.js')
    DoThings() {
      console.log('test1');
    }
  },
  TEST2: { // in your case, do require('./test1.js')
    DoThings() {
      console.log('test2');
    }
  }
};

function DoIt(str){
  // Get the objects from your dictionary
  var obj = imports[str];
  obj.DoThings() 
}

DoIt("TEST1") // fails
DoIt("TEST2") // fails