2013-10-27 78 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值,查询未设置。