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の問題()を呼び出すにはどうすればよいですか?