this
window.myclass オブジェクト内のポインターはそのオブジェクト自体を指し、それを使用して、n1 や n2 など、そのオブジェクトの本質的なプロパティを定義します。
ただし、オブジェクト内で定義された関数内からは、this
ポインタはオブジェクトではなく関数を参照します。***ただし、setTimeouts および setIntervals 内では、「this」キーワードはウィンドウ オブジェクトまたはグローバル スコープを参照します。(たとえば、下部の更新を参照してください。)
したがって、クラスのインスタンス化に使用したグローバルスコープの変数の名前を使用して、プロパティに直接アクセスするだけです。
this.returnAns = function(){
return myclassins.ans;
};
ただし、上記のメソッドは、インスタンス化時にオブジェクトに付けられた名前にクラスを関連付けるため、単一のオブジェクトに対してのみ有効です。
より良い解決策は、オブジェクト内で変数を定義し、それを使用して「this」ポインターを参照することです。
window.myclass = function(){
this.n1 = 0;
this.n2 = 0;
this.ans = 0;
this.hehe = 0;
var _self = this; // reference to "this"
this.defaultNumbersAdd = function(){
myclass.hehe =setInterval(function(){
//just an example of inert function...
//the truth is i can't grab the this.n1 and this.n2...
_self.ans = _self.n1 + _self.n2;
console.log(_self.ans);
},100);
clearTimeout(_self.hehe);
};
this.returnAns = function(){
return _self.ans;
};
this.getAnswer = function(){
this.defaultNumbersAdd(); //i want to reuse this function but I can't access it
return _self.returnAns(); //and also this one
};
this.modifynumbers = function(n1,n2){
_self.n1 = n1;
_self.n2 = n2;
};
};
最後に、クロージャーを使用して関数を定義し、別の関数を返す関数に "this" ポインターを渡すという別の手法もあります。次のようにします。
this.modifynumbers = (function(__this) {
return function(n1,n2){
__this.n1 = n1;
__this.n2 = n2;
}
})(this);
もちろん、最も簡単な方法はvar self
;を使用することです。ただし、JavaScript では、タスクを達成するためのさまざまな方法がいくつかあり、これらの手法はさまざまなシナリオで役立ちます。
アップデート:
@apsillers は、setTimeout および setInterval 関数によって呼び出されるコールバック内で参照される場合、「this」キーワードがウィンドウ オブジェクトを指すことを指摘しました。次に例を示します。
// top level scope
var global = "globalvalue";
window.demo = function() {
this.somevar = "somevalue";
this.someFunct = function() {
console.info("somevar = " + this.somevar); // prints "somevalue"
console.info("global = " + this.global); // prints undefined! this points to "demo"!
setTimeout( function() {
console.info("timeout - somevar = " + this.somevar); // undefined! references the "window" context
console.info("timeout - global = " + this.global); // prints "globalvalue"
},1000);
};
};
var dem = new demo();
dem.somevar; // accessible from outside the object. prints "somevalue"
dem.someFunct();
someFunct() の出力:
# inside method of object
somevar = somevalue
global = undefined
# inside timeout
timeout - somevar = undefined
timeout - global = globalvalue
ご覧のとおり、setTimeout 内では、「this」は明らかにウィンドウまたはグローバル スコープを指しています。(注: 実際には、その小さなコード スニペットを取得して、Chrome または Firebug デバッガーで実行できます。)