Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript ES6-在类中调用静态方法_Javascript_Oop_Ecmascript 6 - Fatal编程技术网

Javascript ES6-在类中调用静态方法

Javascript ES6-在类中调用静态方法,javascript,oop,ecmascript-6,Javascript,Oop,Ecmascript 6,我有一个类,它对静态方法进行内部调用: export class GeneralHelper extends BaseHelper{ static is(env){ return config.get('env:name') === env; } static isProd(){ return GeneralHelper.is('prod'); } } 是否有任何关键字可用于替换下一行中的类名: GeneralH

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

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

     static isProd(){
         return GeneralHelper.is('prod');
     }
 }
是否有任何关键字可用于替换下一行中的类名:

GeneralHelper.is('prod');
在PHP中有
self
static
等。ES6是否提供类似的功能

TY.

与相同。如果调用
GeneralHelper.isProd()
方法,
GeneralHelper
将作为方法中的
this
可用,因此您可以使用

class GeneralHelper {
     static is(env) { … }
     static isProd(){
         return this.is('prod');
     }
}
但是,当方法作为回调函数传递时,这将不起作用。另外,当有人从类继承
isProd
并覆盖
is
时,它可能与显式访问
GeneralHelper
不同,
InheritedHelper.isProd()
将产生其他结果


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

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

this.constructor.functionName()


这里的两个答案都是正确的和好的,但我想在这个问题标题的基础上添加一个细节

当我看到“ES6-在类中调用静态方法”时,听起来像是“在类中调用静态方法(从非静态方法)。Def不是最初提问者在细节中提出的问题

但是对于任何想知道如何从类中的非静态方法调用静态方法的人,您可以这样做:

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!"
其思想是可以调用静态方法,而无需创建类的新实例。这意味着您可以在实例的方法内部调用它,就像在实例外部调用它一样


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

我认为在静态上下文中使用“this”关键字会让人很困惑,但无论如何,它工作得很好,谢谢,在PHP$中,这指的是您在其方法中的当前对象,进入类的方法(静态)你没有这个关键字(你有“self”和最新的“static”)。就我所记得的,同样在Java中,“this”关键字在静态方法中是不可用的,这是有道理的:在静态上下文中没有“this”实体。。“this”必须涉及整个类或一般操作所指的特定实体和静态方法。作为一名JS开发人员,了解
这个
的行为非常重要。在其他语言中,它不像
this
那样工作。@Kidwan:构造函数调用很像方法调用,所以它(唯一的区别是
this
在超级调用之前不可用)。@Kidwan
constructor(){CLASS_NAME.STATIC_method();}
关于这个问题,我在一个单独的线程中发布了一个更复杂的答案:OP不是在询问如何从实例调用它。(如果他是,那将是你链接的问题的副本)那甚至不是答案
this.constructor.is('prod')
在这种情况下会抛出错误。当您在实例化的类中要调用静态方法时,这是一种解决方案,否则只需调用
this.method()
。另外,当您扩展一个类时,您调用
super.method()