ES6 - 在类中调用静态方法

Shl*_*son 70 javascript oop ecmascript-6

我有这个类对静态方法进行内部调用:

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

     static isProd(){
         return GeneralHelper.is('prod');
     }
 }
Run Code Online (Sandbox Code Playgroud)

我可以使用任何关键字来替换下面一行中的类名:

GeneralHelper.is('prod');
Run Code Online (Sandbox Code Playgroud)

在PHP中也有self,static等ES6是否提供类似这些东西吗?

TY.

Ott*_*lla 68

如果从实例内部调用静态函数,则引用类静态函数的正确方法是:

this.constructor.functionName();

es6调用静态方法

  • OP不会询问是否从实例中调用它.(如果他是,那将是您链接的问题的副本) (6认同)
  • 这甚至不是一个答案。在这种情况下, `this.constructor.is('prod')` 会抛出错误。 (2认同)

Ber*_*rgi 47

它与在普通对象上调用方法相同.如果您调用该GeneralHelper.isProd()方法,则该方法GeneralHelper将可用this,因此您可以使用

class GeneralHelper {
     static is(env) { … }
     static isProd(){
         return this.is('prod');
     }
}
Run Code Online (Sandbox Code Playgroud)

当该方法通过围绕一个回调函数然而,这将无法正常工作,只是像往常一样.此外,它可能与GeneralHelper某人isProd从您的类继承并覆盖时显式访问不同is,InheritedHelper.isProd()将产生其他结果.

如果您希望从实例方法调用静态方法,请参阅此处.另请注意,仅定义静态方法的类是一个古怪的类,您可能希望使用普通对象.

  • 我认为在静态环境中使用"this"关键字非常混乱,但无论如何它工作得很好,谢谢 (14认同)
  • 作为一名JS开发人员,了解`this`的行为非常重要.它在其他语言中不像`this`那样工作. (10认同)
  • 是的,在PHP $中,这指的是你在其方法中的当前对象,在类'方法(静态)中你没有这个关键字存在(你有'自我'和最新的'静态').据我所知,同样在Java中"this"关键字在静态方法中不可用 - 而且它是有意义的:当你进入静态上下文时,没有"this"实体."这个"必须谈论特定实体和静态方法,你指的是整个班级或一般行动.. (6认同)

Chr*_*itz 25

这里的两个答案都是正确和好的,但我想基于这个问题标题添加一个额外的细节.

当我看到"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!"
Run Code Online (Sandbox Code Playgroud)

我们的想法是可以在不创建类的新实例的情况下调用静态方法.这意味着您可以在实例的方法中调用它,就像在实例外部调用它一样.

同样,我知道这不是问题的细节所要求的,但这可能对其他人有所帮助.