2015-04-03 33 views
0

我有這樣的代碼中的骨幹項目執行:可執行代碼從對象(優選不EVAL())

main.key1 = new view.a.b.c({prop: val}); 
main.key2 = new view.x.y.z({prop: val}); 
//and so on, about 10 views with about 5 identical properties 

我有一個對象像這樣的主要對象中定義:

var main = this;  
var viewmap = {key1: 'view.a.b.c', key2: 'view.x.y.z'} // and so on 

我要的是用我的對象來代替上面的代碼,因爲意見必須來自一個地圖。

我不反對eval() 100%,但我不希望有使用它。但是,如果這是唯一的方法,我會接受。問題是,我甚至不知道如何使用eval()用於此目的。

我想是這樣的:

for(view in viewmap){ 
    main[view] = eval('new ' + viewmap[view] + '({prop: val});'); 
} 

但它不工作。

請幫忙。

+1

甲方式混淆,這將是通過穿過視圖對象'viewObj = viewObj逐步推進[ARR [i到分裂由'.'字符串和環]]' – SmokeyPHP 2015-04-03 11:49:45

回答

1

分割在. S中的字符串,然後循環所產生的陣列上,並使用括號符號去尋找下一個目標,你想最終的代碼看起來是這樣的

function getObj(base, path) { 
    var arr = path.split('.'), // ["view", "a", "b", "c"] 
     i; 
    for (i = 1; i < arr.length; ++i) // start from 1 to ignore "view" 
     if (!(base = base[arr[i]])) 
      break; // error handling? 
    return base; 
} 
// now your loop that uses `new` on the result of the invocation of the function 
var viewPath; 
for(viewPath in viewmap){ 
    main[viewPath] = new (getObj(view, viewmap[viewPath]))({prop: val}); 
} 

注意額外的一對圍繞getObj呼叫括號所以解釋器不與沒有EVAL的new

+0

現在嘗試了這一點。 – Snowman 2015-04-03 12:00:23

+0

@Tushar如果它沒有分配到正確的位置,這是因爲我沒有正確更新主分配,並且弄亂了'path'和'arr' D:在編輯中修復 – 2015-04-03 12:02:14