2011-01-03 5 views
1

さて、私は今、Javascriptを嫌っています。誰かが私を助けてくれることを願っています。Javascript: "this"が "call"で上書きされた場合、親オブジェクトへの参照を取得するにはどうすればよいですか?

私は次のように設定されているコードがあります。

function Obj1() { 
    var me = this; 

    this.something = "yay"; 

    this.getThis = function(){ 
     return me; 
    } 
} 

Obj1.prototype.method = function() { 
    return this.something; 
}; 

function Obj2() { 
    this.something = "nay"; 

} 
Obj2.prototype.method = function() { 
    return this.something; 
}; 



var o1 = new Obj1(); 
var o2 = new Obj2(); 

document.write(o1.method()); // Returns yay 
document.write(o1.method.call(o2)); // Returns nay, but I need "yay" here 

http://jsfiddle.net/A9u9K/ @ JSFiddle)

私の問題は、私は後者の場合にはObj1.methodを呼び出す必要があること、ですが、私をオブジェクトへの参照を取得することが絶対にできないのです:(

私はこの

編集を回避するにはどうすればよい?:申し訳ありませんが、私は非常に間違って私のサンプルコードを得ました:(それを更新しました。前回の回答からほとんどのコードを取りました。なぜなら、それはずっと上手く、まだ私の問題を示しているからです。

+0

コードでは、実行するように求めています。あなたはjavascriptエンジンにスコープ 'obj2'を持つ' Obj1() 'の' method() 'メソッドを呼び出すよう要求しています。 'Obj1'で' method() 'を呼び出すだけなら、ケース1のように' obj1.method'で止めることができます。これはjavascriptエンジンがオブジェクトスコープで動作する方法です。スコープが別のオブジェクトであれば、呼び出されたメソッドの 'this'キーワードはスコープ付きオブジェクトを指します。 –

+0

うん、私の問題は、 "o1.method.call(o2)"を行ったコードがあったが、その方法では、o1への参照が必要だった。とにかく、私はT.J.からのリンクを読むことで私の問題を解決しました。 Crowder(ありがとうございます:D) – fresskoma

答えて

4

更新回答

document.write(o1.method.call(o2)); // Returns nay, but I need "yay" here

あなたはそれが今でソート持っていると述べましたが、への答えとしてことを実際にSO上でここに示されていません私はそれを示すために更新するかもしれないと思った。

それはあなたがそれは違うthis値と呼ばれていた場合でも、アクセスmeを持ちたいmethodだ場合は、me以上の閉鎖など、getThisのようにそれを定義する必要があります。

function Obj1() { 
    var me = this; 

    this.something = "yay"; 

    this.method = function() { 
     return me.something; 
    }; 

    this.getThis = function(){ 
     return me; 
    }; 
} 

function Obj2() { 
    this.something = "nay"; 

} 
Obj2.prototype.method = function() { 
    return this.something; 
}; 

...か

function Obj1() { 
    var me = this; 
    var something = "yay"; 

    this.method = function() { 
     return something; 
    }; 

    this.getThis = function(){ 
     return me; 
    }; 
} 

function Obj2() { 
    this.something = "nay"; 

} 
Obj2.prototype.method = function() { 
    return this.something; 
}; 
:もちろん、あなたはそれコンストラクタ内VAR( meよう private variable、)作り、オブジェクトのプロパティであることを「何か」を必要としない場合

オリジナル回答(。meを持っていなかった問題の修正1へ)

が、私は(私は4でそうであるように)Javascriptをクロージャを作成するときに、と思いました「これ」を保存する必要があります。

thisは、関数が呼び出された方法によって完全にに設定されている、いない、それはどこに定義されています。その詳細についてはherehereです。閉鎖について

function Obj1() { 
    var me = this;    // <== Use a variable to remember `this` 

    this.something = "yay"; 

    this.method = function() { 
     return this.something; 
    }; 

    this.getThis = function(){ 
     return me;    // <== Return it 
    }; 
} 

Live example

より:しかし、あなたはあなたのgetThis機能を定義したように、あなたはそれがthisを使用せずにこの問題を解決するために、コンストラクタ呼び出し(しゃれ)の上に閉じ事実を使用することができますmeのことをする配管はhereです。

あり、この中に関わるコストは、ちょうど一般的な機能にコンストラクタ関数を定義するあなたのパターンで:Obj1Obj2によって作成された個々のオブジェクトは、各機能のそれ自身コピーを取得します。これらのオブジェクトがたくさんある場合はメモリに影響があります(ただし、たくさんある場合を除き、meなどprivate variablesのようなメリットがあります)。対称的に、プロトタイプに割り当てられた関数を使用すると、すべてのインスタンスが共通の関数のコピーを共有します。 (あなたが閉鎖に頼っているため)あなたのサンプルコードで

、唯一getThis機能は本当にすべてのインスタンスに複製する必要がありますので、あなたは、不要な機能の増殖を避けるために、この操作を行うことができます。

function Obj1() { 
    var me = this; 

    this.something = "yay"; 

    this.getThis = function(){ 
     return me; 
    }; 
} 
Obj1.prototype.method = function() { 
    return this.something; 
}; 

function Obj2() { 
    this.something = "nay"; 

} 
Obj2.prototype.method = function() { 
    return this.something; 
}; 
+0

はい、私はこの方法でもコードを(問題の)書き直します:) – fenderplayer

+0

あなたのコードスニペットを使用して私の問題をより良く説明するために私のサンプルコードを更新しました。私のコードでは(あなただけでなく)私は本当にgetThisメソッドを呼び出すことはできません。これは "this"が上書きされているため意味がありません。以前のサンプルコードを駄目にしました。申し訳ありません。 – fresskoma

+0

@ x3ro:問題は今ソートされていますか? (質問に対するあなたのコメントから)良いことがあれば、喜んで助けました。 –

0

問題は、範囲がこのオブジェクトの参照を変更しています。 代わりに直接閉鎖でこれと同一視ローカル変数を使用し、これを使用している場合、つまり、あなたのObj1とTOL

function Obj1() { 
    this.something = "yay"; 
     var that = this; 

    this.method = function() { 
     return that.something; 
    } 

    this.getThis = function(){ 
     return that; 
    } 
} 
0

Obj1thisの値を保持するために、この別のプレースホルダにあるを解決する唯一の方法を変更し、機能method()getThis()で使用してください。あなたは(obj1.getThis.call(obj2).method())それをやっている理由

function Obj1() { 
    var instance = this; 

    this.something = "yay"; 

    this.method = function() { 
     return instance.something; 
    } 

    this.getThis = function(){ 
     return instance; 
    } 
} 

しかし、私は、スタンドの下にできないのでしょうか? これは、メソッドgetThis()のスコープを他のものに変更することを明示していることを明示的に示しています。次に、この使用法で作成された問題を解決しようとしています。

なぜこのようなことが分かりますか?

+0

実際に私の例を書いていたとき、私は何か間違っていました。私はそれが意味をなさないとあなたに同意する...私は私の質問を編集するつもりです... – fresskoma

関連する問題