Javascript:添加动态方法

Javascript: adding dynamic method

本文关键字:方法 动态 添加 Javascript      更新时间:2023-09-26

我遇到了以下问题。

我有不同的对象,例如:

使用方法的用户: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');

当函数中没有参数时,像这样的动态添加方法可以正常工作。所有方法都定义得很好,但是当我将它们称为键作为更改(当然)时,我只有最后一个函数。

如果有人能帮助我,我整天都在这件事上,但我仍然找不到解决方案。

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,但是当我运行时 找到。ByX(某物);

传递给最后一个值的键恰好是姓氏。它正在运行

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

我在代码中的其他地方以这种方式执行此操作,但似乎因为函数正在等待 args 值,因此未设置查询。

我解决了我的问题,当我调用函数 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;
}

它正在做我想要的。