0

これは私のコードです -

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されるのは、未定義として表示されるためです。私は何を間違っていますか?

4

5 に答える 5

6

を呼び出すとsetUsrLogin(usrLogin);thisコンテキストが失われます。実際、プロパティ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関数prototypeオブジェクトに移動することもできます:

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("");
于 2013-07-10T13:48:53.863 に答える
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/

于 2013-07-10T13:49:19.607 に答える
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);
}
于 2013-07-10T14:12:23.187 に答える
0

問題は、setUsrLogin関数内でインスタンスthisを参照していないことです。searchString

あなたができることは、searchString関数への参照を保存し(これは間違いなくクラスではありません)、それを使用してプロパティにアクセスすることです。また、関数を関数のように変更することもできますsetUsrLogin。これにより、を使用して関数toStringに正しくアクセスできるようになります。searchStringthis

これは機能する 1 つのアプローチです。

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

これが実際の例です

于 2013-07-10T13:48:46.520 に答える
0

ベルギの答えに同意します。

別の「より簡単な」ソリューションを次に示します。

    関数 searchString(usrLogin) {

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

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

      this.setUsrLogin(usrLogin);
    }






于 2013-07-10T14:43:44.770 に答える