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