2016-07-14 38 views
0

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

该对象是使用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 

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

回答

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'); 
+0

注:通过它连接到'global',这些变量[成为提供给所有* *模块。(https://nodejs.org/api/globals.html#globals_global_objects ) –

+0

@MikeC。为什么它应该是一个问题? OP已经写过他的代码,像全局变量是全局对象的一部分。没有人通常会将全局对象的内置键作为某个导入模块的名称进行覆盖,所以不存在影响模块加载过程的危险。 – 2016-07-14 17:14:56

+0

OP只是在刺探如何做到这一点,但他们有什么不起作用。我并不担心它会影响模块加载过程(尽管我认为这也是一个问题)。这是[你应该真的避免全局变量](http://programmers.stackexchange.com/questions/148108/why-is-global-state-so-evil),只要有可能。封装在固体软件工程中是一个非常重要的概念。 –

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