0

这是我的代码 -

function searchString(usrLogin) {

  var setUsrLogin = function (usrLogin) {
    this.usrLogin = (usrLogin == "") ? "*" : usrLogin;
  }


  this.toString = function(){
    return 'source="dbmon-dump://Source/ID" ' + 'USR_LOGIN="' + this.usrLogin + '" ';
  }

  setUsrLogin(usrLogin);
}

$(function() {
  var a = new searchString("");
  $('#searchBar').val(a.toString());
});

a.toString()打印 source="dbmon-dump://Source/ID" USR_LOGIN="undefined" 因为this.usrLogin显示为未定义。我究竟做错了什么?

4

5 回答 5

6

当你打电话时setUsrLogin(usrLogin);,你失去了this上下文。实际上,this您在其上分配usrLogin属性的是全局对象。

为了解决这个问题,

  • 只需删除该函数调用并直接设置它:

    function searchString(usrLogin) {
        this.usrLogin = (usrLogin == "") ? "*" : usrLogin;
        this.toString = function(){
            return 'source="dbmon-dump://Source/ID" ' + 'USR_LOGIN="' + this.usrLogin + '" ';
        }
    }
    
  • 或将实例作为参数传递。任何一个

    function setUsrLogin(usrLogin) {
        this.usrLogin = (usrLogin == "") ? "*" : usrLogin;
    }
    // and then
    setUsrLogin.call(this, usrLogin);
    

    或者

    function setUsrLogin(search, usrLogin) {
        search.usrLogin = (usrLogin == "") ? "*" : usrLogin;
    }
    // and then
    setUsrLogin(this, usrLogin);
    

顺便说一句,您可以将toString函数移动prototype对象

function SearchString(usrLogin) {
   this.usrLogin = (usrLogin == "") ? "*" : usrLogin;
}
SearchString.prototype.toString = function() {
    return 'source="dbmon-dump://Source/ID" ' + 'USR_LOGIN="' + this.usrLogin + '" ';
};
var a = new SearchString("");
于 2013-07-10T13:48:53.863 回答
0

问题是在你的setUsrLogin函数中,this没有引用searchString实例。

您可以做的是存储对您的searchString函数的引用(这绝对不是一个类)并使用它来访问属性。此外,您可以将您的setUsrLogin功能更改为与您的功能类似toString,这样您就可以searchString使用this.

这是一种可行的方法:

function searchString(usrLogin) {
    var self = this;

    this.setUsrLogin = function (usrLogin) {
        self.usrLogin = (usrLogin == "") ? "*" : usrLogin;
    }

    this.toString = function () {
        return 'source="dbmon-dump://Source/ID" ' + 'USR_LOGIN="' + self.usrLogin + '" ';
    }

    self.setUsrLogin(usrLogin);
}

这是一个工作示例

于 2013-07-10T13:48:46.520 回答
0

Bergi的回答几乎涵盖了它。

添加另一种实现方式 - 使用变量来保存 this 的上下文

function searchString(usrLogin) {
  //save the context
  var that = this;
  var setUsrLogin = function (usrLogin) {
     //use that in the internal functions/methods
     that.usrLogin = (usrLogin == "") ? "*" : usrLogin;
  }


  this.toString = function(){
      //use that in the internal functions/methods [Not required in this case though]
      return 'source="dbmon-dump://Source/ID" ' + 'USR_LOGIN="' + that.usrLogin + '" ';
  }

  setUsrLogin(usrLogin);
}
于 2013-07-10T14:12:23.187 回答
0

我同意Bergi的回答。

这是另一个“更简单”的解决方案:

    函数搜索字符串(usrLogin){

      this.setUsrLogin = 函数 (usrLogin) {
         this.usrLogin = (usrLogin == "") ?"*" : 用户登录名;
      }

      this.toString = 函数(){
          return 'source="dbmon-dump://Source/ID" ' + 'USR_LOGIN="' + this.usrLogin + '" ';
      }

      this.setUsrLogin(usrLogin);
    }






于 2013-07-10T14:43:44.770 回答
0
function searchString(usrLogin) {
    this.usrLogin = (usrLogin == "") ? "*" : usrLogin;
    this.toString = function(){
    return 'source="dbmon-dump://Source/ID" ' + 'USR_LOGIN="' + this.usrLogin + '" ';
      };
}


  var a = new searchString("abc");
  alert(a.toString());

这将使用用户名提醒字符串,让我知道这是否有帮助或不是您要查找的内容。 http://jsfiddle.net/rBe6x/

于 2013-07-10T13:49:19.607 回答