非静的 ES6 クラス メソッドからの静的メソッドの呼び出し
ES6 クラスを操作する場合、静的メソッドにアクセスする必要がある場合があります。非静的クラスメソッド内。これを実現するには、コンストラクターを使用するか、クラス名を直接参照するという 2 つの主なオプションがあります。どちらのメソッドも技術的には実行可能ですが、オーバーライドされた静的メソッドによる継承のコンテキストでは異なる動作を示します。
オプション 1: コンストラクターの使用
class SomeObject { constructor(n) { this.n = n; } static print(n) { console.log(n); } printN() { this.constructor.print(this.n); } }
ここではたとえば、静的メソッド print には、コンストラクター this.constructor を介してアクセスします。このアプローチにより、クラスが拡張され、静的メソッドがサブクラスでオーバーライドされた場合でも、正しい静的メソッドが確実に呼び出されます。
オプション 2: クラス名を直接参照する
class SomeObject { constructor(n) { this.n = n; } static print(n) { console.log(n); } printN() { SomeObject.print(this.n); } }
この場合、静的メソッド print はクラス名によって参照されます。このメソッドは本質的に静的であり、継承関係に関係なく、常にクラスで定義された元の値を返します。
継承とオーバーライドに関する考慮事項
コンストラクターを使用するかの選択または、図に示すように、継承およびオーバーライドされた静的メソッドを扱う場合には、クラス名が直接重要になります。以下:
class Super { static whoami() { return "Super"; } lognameA() { console.log(Super.whoami()); } lognameB() { console.log(this.constructor.whoami()); } } class Sub extends Super { static whoami() { return "Sub"; } }
ケース 1: Super.whoami() を使用する
ケース 2: this.constructor.whoami() を使用する
これらのシナリオの動作は、静的メソッドが実際にオーバーライドされるかどうかによって異なる場合があります。クラス名を介して静的プロパティを参照すると、真の静的動作が提供されますが、this.constructor を使用すると、動的なディスパッチと継承を考慮することができます。適切な方法の選択は、特定のコンテキストでの望ましい動作によって異なります。
以上が非静的 ES6 クラス メソッドから静的メソッドを呼び出す方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。