这是我的代码 -
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
显示为未定义。我做错了什么?
答案 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);
}
答案 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); }