2017-03-05 30 views
0

說我有使用require('require-all')從對象編程方式添加方法

tasks = { 
    getProfile: [constructor function] 
    initAll: [constructor function] 
    login: [constructor function] 
}; 

如何添加適當的方法對API的對象創建程序,而無需使用eval

API.prototype.getProfile = function(){ 
    this.runTask(new tasks.getProfile()); 
}; 

API.prototype.initAll = function(){ 
    this.runTask(new tasks.initAll()); 
}; 

API.prototype.login = function(){ 
    this.runTask(new tasks.login()); 
} 

的任務需要能夠遞歸運行,再次呼籲runTask對自己的(所以我真的需要一些編程當量)

+1

使用'VAR FUNC =新功能(argNames,函數體);'看它在MDN – Blindman67

+0

這仍然是一種像使用'eval' BU好的,我接受。 – TeeraMusic

回答

1

如果你只是問如何建立API.prototype編程時給出一個tasks對象,你可以做這樣的事情:

let tasks = { 
    getProfile: [constructor function] 
    initAll: [constructor function] 
    login: [constructor function] 
}; 

// populate API.prototype based on items in tasks 
Object.keys(tasks).forEach(prop => { 
    API.prototype[prop] = function() { 
     this.runTasks(new (tasks[prop])()); 
    } 
}); 
+0

太棒了!我做了類似的事情: for(var task in tasks){API.prototype [task] = function(){ \t \t this.runTasks(new tasks [task]); \t}; }' 但它給了我錯誤的上下文,只給了我處理它的最後一個項目。 – TeeraMusic

+1

@TeeraMusic - 在一個現代化的JS引擎中,你可能會用'let'代替'var'與'for(let任務中的任務){....}'',因爲'let'在'for'循環中創建循環的每次迭代都有一個新的變量,所以它是正確的。但是,因爲我使用了'.forEach()',所以每次迭代都有獨立的函數上下文,所以我的解決方法就是這樣。 – jfriend00

相關問題