更新回答:
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
は、関数が呼び出された方法によって完全にに設定されている、いない、それはどこに定義されています。その詳細についてはhereとhereです。閉鎖について
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です。
あり、この中に関わるコストは、ちょうど一般的な機能に内コンストラクタ関数を定義するあなたのパターンで:Obj1
とObj2
によって作成された個々のオブジェクトは、各機能のそれ自身コピーを取得します。これらのオブジェクトがたくさんある場合はメモリに影響があります(ただし、たくさんある場合を除き、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;
};
コードでは、実行するように求めています。あなたはjavascriptエンジンにスコープ 'obj2'を持つ' Obj1() 'の' method() 'メソッドを呼び出すよう要求しています。 'Obj1'で' method() 'を呼び出すだけなら、ケース1のように' obj1.method'で止めることができます。これはjavascriptエンジンがオブジェクトスコープで動作する方法です。スコープが別のオブジェクトであれば、呼び出されたメソッドの 'this'キーワードはスコープ付きオブジェクトを指します。 –
うん、私の問題は、 "o1.method.call(o2)"を行ったコードがあったが、その方法では、o1への参照が必要だった。とにかく、私はT.J.からのリンクを読むことで私の問題を解決しました。 Crowder(ありがとうございます:D) – fresskoma