ES6-在类中调用静态方法


80

我有一个此类,它对静态方法进行内部调用:

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,

Answers:


74

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

this.constructor.functionName();

es6调用静态方法


10
OP并未询问有关从实例调用它的问题。(如果他是,那将是您链接的问题的重复)
Bergi

这甚至不是答案。this.constructor.is('prod')在这种情况下会抛出错误。
UtkarshPramodGupta,

当您想在实例化类中调用静态方法时,这是解决方案,否则只需调用即可this.method()。另外,当您扩展课程时,您会叫super.method()

53

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

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

但是,当方法像往常一样作为回调函数传递时,这将不起作用。此外,GeneralHelper当有人isProd从您的类继承并覆盖时isInheritedHelper.isProd()将产生其他结果,这可能与显式访问有所不同。

如果要从实例方法调用静态方法,请参见此处。还要注意,仅定义静态方法的类是一个奇怪的类,您可能想使用一个普通对象。


16
我认为在静态上下文中使用“ this”关键字非常令人困惑,但是无论如何它都可以正常工作,谢谢
Shlomi 2015年

6
是的,在PHP $ this中,它引用您所在方法中的当前对象,在类方法(静态)中,您不存在此关键字(您拥有“ self”和最新的“ static”)。据我所记得,在Java中,“ this”关键字在静态方法中也不可用-这是有道理的:当您进入静态上下文时,没有“ this”实体。.“ this”必须在谈论特别是实体进入静态方法你指全班或一般的动作..
施洛米

10
作为JS开发人员,了解this行为方式非常重要。它不能像this其他语言一样工作。
loganfsmyth,2015年

1
@kidwon:构造函数调用很像方法调用,因此 与相同(唯一的区别是this在超级调用之前不可用)。
Bergi

1
@kidwon constructor(){ CLASS_NAME.STATIC_METHOD(); }
Morteza Tourani '16

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!"

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

同样,我知道这不是问题的详细内容,但这可能会对其他人有所帮助。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.