2013-10-27 3 views
0

У меня возникла следующая проблема.Javascript: добавление динамического метода

У меня есть другой объект, как:

пользователя с помощью метода: идентификатор, имя пользователь, ПгвЬЫата, LastName
статьи: с каким-либо другим способом;

я хочу, чтобы добавить динамический метод как 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

Ваш вопрос кажется непонятным, потому что ваш код неполный, что означает 'this'? 'user', но интуитивно, кажется, что каждый ключ в вашем цикле должен переопределять его прецедент. – Newben

ответ

0

Я решаю свою проблему, когда я вызывал функцию ByX, значение ключа было последним в моем объекте. Поэтому я положил функцию в закрытие. Но внутри закрытия это не означало найти общий объект.

Так что я просто передаю это в своем закрытии.

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); 
     }) 
    ; 

при компиляции кода объекта ФИНД методы через х, но когда я бегу find.ByX (что-то);

Ключ, переданный последнему значению, является последним. и это запустить

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

Я сделал это таким образом, где-то в моем коде, но это кажется, потому что функция ожидает значение арга, запрос не установлен.

Смежные вопросы