0

js 学習用に次のコードがあります。

function A() {
    var self = this;

    this.test1 = function() {
        console.log("A_test1");
        B().test2();
        return self;
    } 

    this.problem = function() {
        console.log("I'm never called");
    }

    return self;
}

function B() {
    var self = this;

    this.test2 = function() {
        console.log("B_test2");
        return self;
    }  

    this.problem = function() {
        console.log("I'm a headach and overwrite others in my free time");
    }

    return self;
}

/*
 * This is our "main" function like in C
 */
$(function(){
    A().test1().problem();
});

Firebug でコードをデバッグしました。以下の「main」関数の行を段階的に調べてみましょう: A().test1().problem();

1) A()
「キーワード「this」は関数 (クラス) オブジェクトではありません。現在のオブジェクトのプロパティ/メソッドによって実行時に 1 行ずつ拡張されるのは、常に「ウィンドウ」オブジェクトです (私たちの場合: A の関数オブジェクト). したがって、A() の最後に到達すると (つまり、"return self")、"this" オブジェクトの内容は次のようになります。

  • 「ウィンドウ」オブジェクトのすべてのプロパティ/メソッド
  • A の test1() および problem() メソッド

2) A().test1()
test1() メソッドには「B().test2();」という行があります。したがって、次の B() として呼び出します

2.1) B() B()
の最後に到達する (つまり、self を返す) と、"this" オブジェクトの内容は次のようになります。

  • 「ウィンドウ」オブジェクトのすべてのプロパティ/メソッド
  • A の test1() メソッド
    [A の problem() メソッドは、B の problem() によって上書きされるため失われます]
  • B の test2() および problem() メソッド

2.2) B().test2()
これは期待どおりに動作し、問題ありません。これで、A().test1() が完成しました。

3) A().test1().problem();
そして、これはBの問題()メソッドを呼び出しますが、ここではAの問題()を呼び出したいです。

では、「this」オブジェクトのオンライン状態を保存する適切な方法は何ですか? (「self」は「this」オブジェクトへの参照(Cのように)であるため、ここではまったく効果がないことは明らかです。)

すべてのコンストラクターの先頭で「this」オブジェクトの状態を複製できます。つまり

var self = this;

どのようにそのことについて

var self = this.clone();

しかし、それが良い考えかどうかはわかりません。新しく作成されたすべてのオブジェクトの「this」の状態を複製すると、大規模なフレームワークでメモリが失われますよね?

この問題に直面したのは私が初めてではないと確信しています。私のGoogle検索では、あまり得られませんでした。では、「これ」を保存する適切な方法は何ですか? この例で、Bの問題()の代わりにAの問題()を呼び出すにはどうすればよいですか?

4

4 に答える 4

2

Aコンストラクター ie として使用する必要がある場合var a = new A()、これは代わりに新しいオブジェクトを指しますwindow

于 2013-05-02T04:56:50.400 に答える
2
var x = new A();

newjavascript のキーワードには、this変数を新しいインスタンスに設定する機能があります。関数内var x= A();よりも使用するだけの場合(つまり、グローバルコンテキスト)。thisAwindow

これらの単純な設定ではvar self = this;、コールバックが必要になるまで使用する必要はありませんが、便宜上、副作用なしで使用できます。変数の値をこれに設定して一貫性を持たせることは完全に正しく、非常に一般的です。変数の名前は通常ではthatなく、selfただの砂糖です。

于 2013-05-02T04:56:53.427 に答える
1

他の答え (「使用new」) は正しいです。

John Resig の作品から恩恵を受けると思います。彼の著書 ( Secrets of the Javascript Ninja ) を読むか、彼の Web サイトでインタラクティブな Javascript チュートリアルをチェックしてください。

于 2013-05-02T05:03:20.297 に答える
1

new関数を呼び出すthisと、実際にはウィンドウではなくオブジェクトのインスタンスになります...そう...

function Foo(){
   this.whatAmI = function(){
         console.log("I am " + this);  
   }
}


var bar = new Foo();
bar.whatAmI();
于 2013-05-02T04:55:54.797 に答える