8

Javascript の私のクラスの 1 つは、時々 Json で「更新」する必要があります。IDを指定してデータの配列を更新する関数を常に実行してきましたが、今ではもっとカプセル化して実行したいと考えていました(関数の更新、クラス内)。

私が作ったもの:

function File(data){
        this.data = data;

        this.update = function (callback){
            var set = function(ajaxData){
                this.data = ajaxData.PcbFile;
            }
            getPcbFile(data.id, function(ajaxData){
                set(ajaxData);
                callback();
            });
        };
    }

しかし、this.data = ajaxData.PcbFile;うまくいきません...私のオブジェクトは、更新されたデータセットではなく、最後のデータセットのままです。関数 SET は、データを設定する別の試みとして作成されました。

ajaxDataをデバッグしたので、ajaxに問題はありません(更新時)。

dataでは、内部関数からオブジェクト プロパティに実際にアクセスするにはどうすればよいでしょうか。

(私の英語でごめんなさい...)

4

4 に答える 4

22

私はこれを難しい方法で学びました。注意が必要thisです。オブジェクトを含むのではなく、常にthis現在のスコープ内の を参照します。で何かをラップするたびに、別のスコープfunction() { ... }になります。thisあなたの場合、オブジェクトをローカル変数に複製し、そのプロパティを操作し.dataます。

function File(data){
    this.data = data;
    var file = this; //call the variable whatever you want
    this.update = function (callback){
        var set = function(ajaxData){
            file.data = ajaxData.PcbFile;
        }
        getPcbFile(data.id, function(ajaxData){
            set(ajaxData);
            callback();
        });
    };
}
于 2012-08-06T03:34:12.543 に答える
7

キャッシュthisして、同じコンテキストで別の場所で参照できるようにします。

function File(data){

  var self = this;

  self.data = data;

  self.update = function (callback){
    var set = function(ajaxData){
      self.data = ajaxData.PcbFile;
    }
    getPcbFile(data.id, function(ajaxData){
      set(ajaxData);
      callback();
    });
  };
}
于 2012-08-06T03:34:40.287 に答える
1

これを試して:

function File(data){
    this.data = data;

    var self = this;

    this.update = function (callback){
        var set = function(ajaxData){
            self.data = ajaxData.PcbFile;
        }
        getPcbFile(data.id, function(ajaxData){
            set(ajaxData);
            callback();
        });
    };
}

関数内の の値はthis、その関数の呼び出し方法によって異なります。たとえば、「ドット」表記を使用する場合は、someObj.someMethod()内でsomeMethod()this設定しsomeObjます。またはメソッドthisを使用して、他のオブジェクトに明示的に設定できます。それ以外の場合のように関数を呼び出すと、グローバル オブジェクト ( ) になります。.apply().call()set(ajaxData)thiswindow

関数の外部への参照を保持することthisで (この目的では変数名selfを使用することをお勧めします)、関数内で参照できます。

于 2012-08-06T03:34:38.447 に答える