Javascript中未定义的类变量

时间:2013-07-10 13:37:04

标签: javascript jquery

这是我的代码 -

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() print source =“dbmon-dump:// Source / ID”USR_LOGIN =“undefined”,因为this.usrLogin显示为未定义。我做错了什么?

5 个答案:

答案 0 :(得分:6)

当您致电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("");

答案 1 :(得分: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);
}

Here is a working example

答案 2 :(得分: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/

答案 3 :(得分:0)

Bergi的答案几乎涵盖了它。

添加另一种实现方法 - 使用变量来保存此

的上下文
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);
}

答案 4 :(得分:0)

我同意Bergi的回答。

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


    function searchString(usrLogin) {

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

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

      this.setUsrLogin(usrLogin);
    }