2
function Apple(){
    this.name="apple";
}
function Orange(){
    this.name="orange";

    this.apple = new Apple();
    this.apple.onCalled=function(){
        alert(this.name);
    }
}
Orange.prototype.onCalled=function(){
    this.apple.onCalled();
}
var orange = new Orange();
orange.onCalled();

現在、コードは「アップル」を示しています。「this.apple.onCalled=function()」の行を「オレンジ」と表示されるように変更するにはどうすればよいですか?

つまり、関数を別のオブジェクトに渡したいのですが、その関数が呼び出されると、関数を実行しているオブジェクトの変数ではなく、関数を渡したオブジェクトの変数にアクセスします。明らかな解決策はグローバル変数(orange.nameなど)を使用することですが、オブジェクトが多く、すべてをグローバル化する必要がないため、より良い方法を探しています。

4

3 に答える 3

4

クロージャーを使用します。

function Orange(){
    this.name="orange";

    this.apple = new Apple();
    var that = this;
    this.apple.onCalled=function() {
        alert(that.name);
    }
}

JSでキーワードがどのように機能するかを読んでくださいthis。少し注意が必要ですが、理解しやすいです。

于 2012-07-02T16:42:06.783 に答える
1

あなたは書くことができます:

Orange.prototype.onCalled=function(){
    this.apple.onCalled.call(this);
}

一般的な答えを出すのは難しいです。理解しておくべきことは、それthisはすべての関数呼び出しにバインドされているということです。callこれは、またはapply関数を使用して明示的に制御することも.、オブジェクトのプロパティとして関数にアクセスするときに演算子によって制御することもできます。

クロージャーの使用についてコスが与える答えも関連している可能性があります。それはあなたが望む効果に依存します。

于 2012-07-02T16:42:03.473 に答える
1
Orange.prototype.onCalled=function(){
    this.apple.onCalled.call(this);
}

例: http: //jsfiddle.net/XrtZe/

ご覧ください:JavaScriptのスコープ

于 2012-07-02T16:42:12.680 に答える