0

編集:コードに問題が見つかりました-解決策については私の回答を参照してください。

簡単な質問:

別のクラス内のクラスのインスタンスにアクセスしたいのですが、どうすればできますか? これが私の問題の簡単な例です:

var instanceA = new ClassA();

function ClassA(){
    var instanceB = null;

    this.start = function(){
        instanceB = new ClassB();
        instanceB.start();
    }

    this.action = function(){
        console.log('works not');
    }
} 

function ClassB(){
    this.start = function(){
        instanceA.action(); // this throws: Uncaught ReferenceError: instacneA is not defined 
    }
} 
4

3 に答える 3

1

関数に渡します。

this.start = function(instA) { ... }
instanceB.start(instanceA);

または、このインスタンスが複数のメソッドで再利用される場合は、コンストラクターに渡します

function ClassB(instA) {
    this.instanceA = instA;
    this.start = function() { this.instanceA.action(); }
}

PS グローバル変数は悪です (ほとんどの場合)。var instanceA = ...作成します。ですから、簡単なプロトタイプであれば問題ありません。そうでない場合 - これを避けるようにしてください

于 2013-03-28T11:54:06.823 に答える
0

instanceA.start() を呼び出すと、例は正常に動作するように見えますが - http://jsfiddle.net/infernalbadger/U5aUd/

thisグローバルに依存するのではなく、ClassA ( ) のインスタンスを ClassB に渡す方がよいでしょう。

function ClassA(){
    var instanceB = null;
    var self = this;             // Save instance of ClassA
    this.start = function(){
        instanceB = new ClassB();
        instanceB.start(self);   // Pass to ClassB
    }

    this.action = function(){
        console.log('works not');
    }
} 

function ClassB(){
    this.start = function(a){       // Use passed in instance of ClassA
        a.action(); 
    }
} 

http://jsfiddle.net/infernalbadger/U5aUd/1/

于 2013-03-28T11:57:43.000 に答える
0

わかりました、申し訳ありません - 問題が見つかりました:

jquery を使用していて、$(document).ready 関数内に instanceA 変数を作成しました。

$(document).ready 関数の前に instanceA を作成すると、機能します。

だから、たとえ問題を解決したとしても、私はそれを理解していません。私の最初のアプローチがうまくいかなかった理由を誰かが私に説明できますか?

于 2013-03-28T12:00:59.670 に答える