这是我的代码-

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显示为未定义。我究竟做错了什么?

最佳答案

呼叫setUsrLogin(usrLogin);时,您就失去了this context。实际上,为其分配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函数to the prototype object

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("");

10-08 00:52