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
在超级调用之前不可用)。@Kidwanconstructor(){CLASS_NAME.STATIC_method();}
关于这个问题,我在一个单独的线程中发布了一个更复杂的答案:OP不是在询问如何从实例调用它。(如果他是,那将是你链接的问题的副本)那甚至不是答案this.constructor.is('prod')
在这种情况下会抛出错误。当您在实例化的类中要调用静态方法时,这是一种解决方案,否则只需调用this.method()
。另外,当您扩展一个类时,您调用super.method()