2013-10-27 77 views
0

我遇到了以下問題。Javascript:添加動態方法

我有不同的目的,如:

該方法用戶:ID,用戶名,名字,姓氏
文章:與其他一些方法;

我想添加動態方法一樣getById,getByUsername等

var object = new Object() ; // Object can take the value user, article or other. </code> 
for(var key in object) { 
this["getBy" + key]= function(args) { 
    var result = query("SELECT * FROM " + object.name + ' WHERE ' key + "=" +args); 
    console.log(key); //always return the last key of object 
    return(result); 
} 

// then 

var user = new User(); 
user.getByUsername('someone'); 

方法的這樣的動態添加工作正常時,沒有在功能上沒有的參數。所有的方法都很好定義,但是當我把它們稱爲關鍵的變化(當然)時,我只有最後一個功能。

如果有人可以幫助我,我一整天都在這上面,而且我仍然找不到解決方案。

+0

你能否精確地說明你如何調用函數? – Newben

+0

順便說一句,你能提供關於'user'對象的細節嗎? – Newben

+0

你的問題似乎並不清楚,因爲你的代碼不完整,這是指什麼? '用戶'對象,但直觀​​地說,似乎發生的事情是,循環中的每個鍵都必須覆蓋它的先例 – Newben

回答

0

我解決了我的問題,當我調用函數ByX時,key的值是我的對象中的最後一個。所以我把這個函數放在了一個閉包中。但在關閉內部,這並不是指發現,而是一個普遍的對象。

所以我只是通過這封閉內我。

for(var key in Object){ 
    var query = 'SELECT * FROM user WHERE ' + key + "=\'"; 

     (function(insideQuery, obj){ 
      console.log(obj); 
      addMethod("By"+key, obj, function(args) { 

        insideQuery+= args + "\'"; 
        console.log(insideQuery); 
        return(connection.query(insideQuery)); 
       }); 

     })(query, this); 
    } 


function addMethod(key, obj, fn){ 
    obj[key] = fn; 
} 

它正在做我想做的。

0
var User = function(id, username, firstname, lastname) { 
       this.name = 'user'; 
       this.id = id; 
       this.username = username; 
       this.firstname = firstname; 
       this. lastname = lastname; 
      }; 



var Find = function(objectName){ 

       var object = new objectName(); 

       // I have a first method all 
       // this refers to find object 
       this.all = connection.query("SELECT * FROM " + objectName); 


       //then I want to add ByX method, X taking the values id, username ... 

       for(key in object) { 
        if(key != "name") { // I exclude name method of user 

         var query = "SELECT * FROM user WHERE " + key + "=" ; 

         this['By'+key] = function(args) { 
          query += args; 
          return(connection.query(query); 
         }; 

       } 



// then In my code 

var find = new Find('User'); 
var list = find.ByX(something); 
    list 
     .on("error", function(err){ 
      console.log(err); 
     }) 
     .on('result' function(row){ 
      console.log(row); 
     }) 
    ; 

當代碼編譯對象查找有方法BYX,但是當我運行 find.ByX(東西);

傳遞給上一個值的鍵是它的名字。並且它的運行

var query = "SELECT * FROM user WHERE " + key + "=" ; 
function(args) { 
     query += args; // query is recalculated and key is now lastname; 
     ... 
} 

我做到了,這樣在我的代碼別的地方,但似乎因爲功能正在等待ARGS值,查詢未設置。