【问题标题】:Javascript: adding dynamic methodJavascript:添加动态方法
【发布时间】:2013-10-27 00:33:17
【问题描述】:

我遇到了以下问题。

我有不同的对象,例如:

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

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

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

【问题讨论】:

  • 你能具体说明你是如何调用这些函数的吗?
  • 顺便说一句,您能否提供有关 user 对象的详细信息?
  • 您的问题似乎不清楚,因为您的代码不完整,this 指的是什么? user 对象,但直观​​地说,似乎发生的是循环中的每个键都必须覆盖其先例
  • 正如所写,您的代码中的this 当前指的是全局(或在节点中,模块全局)对象。或者在 ES5 严格模式下它甚至可以引用 null。由于 javascript 中的 this 取决于周围代码的执行方式,因此您还需要为此提供代码 - 它是构造函数吗?回调?事件处理程序?
  • 您的SELECT 方法很难且不可维护,通常在User,Article 上有标准方法作为数据库的实体,您通过构建一个更难的SELECT查询而不是构建方法。

标签: javascript node.js object dynamic methods


【解决方案1】:
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(something);

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

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

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

【讨论】:

    【解决方案2】:

    我解决了我的问题,当我调用函数 ByX 时,key 的值是我对象中的最后一个。所以我把这个函数放在一个闭包中。但是在闭包里面 this 不是指 find 而是一个通用对象。

    所以我只是在我的闭包中传递这个。

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

    它正在做我想做的事。

    【讨论】:

      猜你喜欢
      • 2010-10-09
      • 2016-06-05
      • 1970-01-01
      • 2023-01-19
      • 2011-08-10
      • 1970-01-01
      • 1970-01-01
      • 2012-03-11
      • 2022-01-08
      相关资源
      最近更新 更多