ES6 - 在类中调用静态方法

IT技术 javascript oop ecmascript-6
2021-02-02 18:15:35

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

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提供类似于这些东西吗?

泰。

3个回答

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

this.constructor.functionName();

从常规 ES6 类方法调用静态方法

这甚至不是一个答案。this.constructor.is('prod')在这种情况下会抛出错误。
2021-03-29 18:15:35
当您想在实例化类中调用静态方法时,这是解决方案,否则您只需调用this.method(). 此外,当您扩展一个类时,您会调用super.method()
2021-04-06 18:15:35
OP 并没有询问从实例中调用它。(如果是,那将是您链接的问题的副本)
2021-04-12 18:15:35
投反对票,因为这不能回答问题。
2021-04-12 18:15:35

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

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

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

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

是的,在 PHP 中 $this 是指您在它的方法中的当前对象,在类的方法(静态)中,您没有此关键字存在(您有“自我”和最新的“静态”)。据我所知,在 Java 中,“this”关键字在静态方法中也不可用 - 这是有道理的:当您进入静态上下文时,没有“this”实体..“this”必须谈论特定实体和静态方法,您指的是整个类或一般操作..
2021-03-25 18:15:35
@kidwon:构造函数调用很像方法调用,所以它和那里一样(唯一的区别是this在超级调用之前不可用)。
2021-04-11 18:15:35
@kidwon constructor(){ CLASS_NAME.STATIC_METHOD(); }
2021-04-11 18:15:35
我认为在静态上下文中使用“this”关键字非常令人困惑,但无论如何它工作正常,谢谢
2021-04-13 18:15:35
作为 JS 开发人员,了解this行为方式非常重要它不像this其他语言那样工作
2021-04-14 18:15:35

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

当我看到“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!"

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

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