Javascript中未定义的类变量

Javascript中未定义的类变量,javascript,jquery,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.usrLo

这是我的密码-

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

问题是在您的
setUsrLogin
函数中,
这个
没有引用
searchString
实例

您可以做的是存储对
searchString
函数的引用(该函数肯定不是类)并使用它访问属性。此外,您可以将
setUsrLogin
函数更改为类似于
toString
函数,这样您就可以使用
this
正确访问
searchString
函数

这是一种可行的方法:

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

问题在于,在
setUsrLogin
函数中,
未引用
搜索字符串
实例

您可以做的是存储对
searchString
函数的引用(该函数肯定不是类)并使用它访问属性。此外,您可以将
setUsrLogin
函数更改为类似于
toString
函数,这样您就可以使用
this
正确访问
searchString
函数

这是一种可行的方法:

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

当您调用
setUsrLogin(usrLogin)时,您的密码正在丢失。事实上,在其上分配
usrLogin
属性的
this
是全局对象

为了解决这个问题

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

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

顺便说一句,您可以将
移动到字符串
功能:


调用
setUsrLogin(usrLogin)时,您的密码正在丢失。事实上,在其上分配
usrLogin
属性的
this
是全局对象

为了解决这个问题

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

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

伯吉的回答几乎涵盖了这一点

添加另一种实现方法-使用变量保存此文件的上下文

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

我同意伯吉的回答

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

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); } 函数searchString(usrLogin){ this.setUsrLogin=函数(usrLogin){ this.usrLogin=(usrLogin==”)?“*”:usrLogin; } this.toString=函数(){ return'source=“dbmon”-dump://Source/ID“'+'USR_LOGIN=“'+this.usrLogin+'”; } this.setUsrLogin(usrLogin); }
我同意伯吉的回答

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

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); } 函数searchString(usrLogin){ this.setUsrLogin=函数(usrLogin){ this.usrLogin=(usrLogin==”)?“*”:usrLogin; } this.toString=函数(){ return'source=“dbmon”-dump://Source/ID“'+'USR_LOGIN=“'+this.usrLogin+'”; } this.setUsrLogin(usrLogin); }
您似乎在假设函数中的变量和相同函数中的
this
的属性是相同的。你在什么地方学的?他们完全是分开的。有不同的解决方案,但我不确定为什么您首先要使用这些嵌套函数。我来自Java背景,这是我的一个错误。好的,要使用与当前代码最相似的解决方案,您可以将
var setUsrLogin=func…
更改为
this.setUsrLogin=func…
,然后将调用更改为this.setUsrLogin(usrLogin)
。但总的来说,这里的函数似乎比需要的要多。Crazy Train是对的,您使用函数的私有变量作为实例对象的方法。this.usrLogin是一个实例属性,其中as userLogin是变量嵌套函数定义中的另一件事内部函数无法访问外部函数的参数和此对象,因此问题在于您似乎假设相同函数中的函数中的变量和
this
的属性是相同的同样的事情。你在什么地方学的?他们完全是分开的。有不同的解决方案,但我不确定为什么您首先要使用这些嵌套函数。我来自Java背景,这是我的一个错误。好的,要使用与当前代码最相似的解决方案,您可以将
var setUsrLogin=func…
更改为
this.setUsrLogin=func…
,然后将调用更改为this.setUsrLogin(usrLogin)
。但总的来说,这里的函数似乎比需要的要多。Crazy Train是对的,您使用函数的私有变量作为实例对象的方法。this.usrLogin是一个实例属性,其中as userLogin是变量嵌套函数定义中的另一件事内部函数无法访问外部函数的参数和此对象,因此有问题too@Bergi:不,不是,什么?停止在javascipt中使用术语类。改用reference Type“
这个
指的是
toString
函数”它不是。chetanmehta:OP使用了术语“class”,这就是我使用它的原因,所以他们理解我指的是什么to@musefan:嗯。。。我倾向于认为人们都在等着听我说什么;D@Bergi:不,不是,什么?停止在javascipt中使用术语类。改用引用类型“
引用
t