2016-07-14 60 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