2012-02-24 10 views
2

JavaScriptオブジェクトを次のように作成しようとしています。JavaScript 'this' in different context

var MyObject = function (parameters) { 
    this.parameters = parameters; 
    parameters.userFunction(this.MyObjectCallback); 
} 

MyObject.SOME_STATIC_VARIABLE = 21; 

MyObject.prototype = { 
    myObjectCallback: function() { 
     console.log(this); 
    } 
} 

MyObjectオブジェクトは、ハンドラを渡すuserFunctionを受け入れます。ユーザー機能は、たとえば、いくつかのロジックを行うと、インスタンスに戻って、結果を渡します:

new MyObject({userFunction: function(callback) { 
    $.post(
     'http://localhost/~knyttl/source.php', 
     {}, 
     callback, 
     'json');, 
}}); 

残念ながら、callbackが適切と呼ばれていても、thisMyObjectインスタンスのJQueryオブジェクトのインスタンスを取得していません私が望むように。結論として、私はMyObjectインスタンスを維持することはできません。

これがJavaScriptオブジェクトを作成する正しい方法かどうかはわかりません。私はどんな提案にも感謝します。

答えて

5

.bindを使用して特定のthis値をバインドできます。また、私はMyの大文字を修正しました。あなたはbthis === a内、a.b()のような関数を呼び出す

parameters.userFunction(this.myObjectCallback.bind(this)); 

。しかし、に直接呼び出すのではなく、(a.bのような)関数を渡して後で呼び出すと、このバインディングは失われます。

.bindは、今度はthisというjQuery ajaxの結果を受け取る新しい関数を返します。ただし、それを無視して、myObjectCallbackを事前定義済み(バインド済み)thisで呼び出します。

.bindは古いブラウザでは利用できませんが、利用可能なシムがあります。

0

jQueryでは、コールバックのcontextを設定できます。

あなたはデザインが傷ついている奇妙な状況に陥っています。 MyObjectは同時に作成されているため、コンテキストとして渡すことはできません。

new MyObject({userFunction: function(callback) { 
    $.post(
     'http://localhost/~knyttl/source.php', 
     {}, 
     callback, 
     'json');, 
}}); 

ので、代わりに:

var myObj = new MyObejct(); 
myObj.setCallback({userFunction: function (callback) { 
    $.ajax({ 
     context: myObj, 
     url: 'http://localhost/what ever /', 
     success: callback, 
     dataType: 'json', 
     data: {} 
    } 
}); 
0

は非常に混乱する可能性を秘めています。関数が呼び出されたときに、ドットの後ろにあるものの値が割​​り当てられます。

window.doSomething(); 

このこのがmyDOMElementに設定されるようになります

myDOMElement.onClick(); 

のに対し、ウィンドウに設定されます。

あなたのケースでは、JQueryの内部動作になるので、this very thorough set of explanationsを参照して、の処理方法を理解してください。