プロミスを使用する際に、クラスメソッド内でthisが未定義になる理由
クラスメソッド内部では、`this` の値はメソッドの呼び出し方法によって異なります。通常の関数呼び出しでクラスメソッドを呼び出す場合、`this` はそのメソッドを呼び出したオブジェクトを指します。一方、アロー関数でクラスメソッドを呼び出す場合、`this` は外部スコープから継承され、クラスのインスタンスにバインドされません。アロー関数は独自のコンテキストを持たないため、親コンテキストの `this` の値を継承します。
Promiseのthenメソッドにクラスメソッドをコールバック関数として渡した場合、そのメソッドはクラスメソッドとしてではなく、通常の関数として呼び出される。そのため、thisはグローバルオブジェクト(ブラウザ環境では通常windowオブジェクト)かundefined(厳格モードの場合)を参照することになる。
クラスメソッド内で this を正しく使用するには、クラスメソッド定義にアロー関数が使用できます。アロー関数を使用することで、 this は外部スコープから継承され、適切にクラスインスタンスを指し示すようになります。たとえば
class MyClass {
myMethod() {
return new Promise((resolve, reject) => {
// 在这里可以正常访问this
resolve(this.someData);
});
}
}
アロー関数でクラスメソッドを定義する際の注意点
- 矢印関数はコンストラクタとして使用することができないので、クラスのインスタンスを new キーワードを使用して作成できません。
- アロー関数は、独自のargumentsオブジェクトがなく、superキーワードを使用して親クラスのメソッドにアクセスすることはできません。
- アロー関数は、call、apply、bind メソッドを使用しても、自身の this を変更できません。