ES6-クラス内で静的メソッドを呼び出す


82

静的メソッドの内部呼び出しを行う次のクラスがあります。

export class GeneralHelper extends BaseHelper{
     static is(env){
          return config.get('env:name') === env;
     }

     static isProd(){
         return GeneralHelper.is('prod');
     }
 }

以下の行のクラス名を置き換えるために使用できるキーワードはありますか?

GeneralHelper.is('prod');

PHPにはselfstaticなどがあります。ES6はこれらに類似したものを提供しますか?

TY。


この問題に関して、別のスレッドでより複雑な回答を投稿しました:stackoverflow.com/a/43694337/3182819
Thomas Urban

回答:


74

インスタンス内から静的関数を呼び出す場合、クラス静的関数を参照する正しい方法は次のとおりです。

this.constructor.functionName();

es6は静的メソッドを呼び出します


11
OPはインスタンスからの呼び出しについて質問していません。(もし彼がそうだったら、それはあなたがリンクした質問の複製になるでしょう)
ベルギ2017

それも答えではありません。this.constructor.is('prod')この場合、エラーがスローされます。
UtkarshPramodGupta

これは、インスタンス化されたクラス内にいるときに静的メソッドを呼び出したい場合の解決策ですthis.method()。それ以外の場合は、を呼び出すだけです。また、呼び出すクラスを拡張する場合super.method()

54

これは、通常のオブジェクトでメソッド呼び出すのと同じです。GeneralHelper.isProd()メソッドを呼び出すと、メソッドとGeneralHelper同じように利用できるのでthis

class GeneralHelper {
     static is(env) { … }
     static isProd(){
         return this.is('prod');
     }
}

ただし、これは、メソッドが通常どおりコールバック関数として渡される場合は機能しません。また、アクセスと異なる場合がありますGeneralHelper明示的に誰かの継承をisProdあなたのクラスと上書きからisInheritedHelper.isProd()他の結果を生成します。

インスタンスメソッドから静的メソッドを呼び出す場合は、こちらをご覧ください。また、静的メソッドのみを定義するクラスは奇妙なものであることに注意してください。代わりにプレーンオブジェクトを使用することをお勧めします。


17
静的なコンテキストで「this」キーワードを使用するのはかなり紛らわしいと思いますが、とにかくうまく機能しています。ありがとう
Shlomi 2015年

6
はい、PHPでは$ thisは、メソッド内にある現在のオブジェクトを参照し、クラスのメソッド(static)には、このキーワードは存在しません( 'self'と最新の 'static'があります)。私が覚えている限り、Javaでも「this」キーワードは静的メソッドで使用できません-そしてそれは理にかなっています:静的コンテキストにいるときは「this」エンティティはありません..「this」は話さなければなりません特定のエンティティと、クラス全体または一般的なアクションについて参照している静的メソッドに..
Shlomi 2015年

11
JS開発者として、this動作を理解することは非常に重要です。this他の言語のようには機能しません。
loganfsmyth 2015年

1
@kidwon:コンストラクターの呼び出しはメソッドの呼び出しに非常に似ているため、そこと同じです(ただしthis、スーパー呼び出しの前に使用できないという違いがあります)。
ベルギ2016年

1
@kidwonconstructor(){ CLASS_NAME.STATIC_METHOD(); }
Morteza Tourani 2016年

33

ここでの答えはどちらも正解で良いのですが、この質問のタイトルに基づいて詳細を追加したいと思いました。

「ES6--クラス内で静的メソッドを呼び出す」を見たとき、「クラス内で(非静的メソッドから)静的メソッドを呼び出す」ように聞こえました。最初の質問者が詳細で何を尋ねているのかを定義しません。

しかし、クラス内の非静的メソッドから静的メソッドを呼び出す方法を知りたい人は、次のように行うことができます。

class MyClass {
    myNonStaticMethod () {
        console.log("I'm not static.")
        MyClass.myStaticMethod()
    }

    static myStaticMethod () {
        console.log("hey, I'm static!")
    }
}

MyClass.myStaticMethod() // will log "hey, I'm static!"

const me = new MyClass()

me.myNonStaticMethod() // will log "I'm not static" and then "hey, I'm static!"

静的メソッドは、クラスの新しいインスタンスを作成せずに呼び出すことができるという考え方です。つまり、インスタンスの外部で呼び出すのと同じ方法で、インスタンスのメソッドの内部で呼び出すことができます。

繰り返しますが、それは質問の詳細が求めていたものではないことを私は知っていますが、これは他の人々に役立つ可能性があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.