ES6-클래스 내에서 정적 메서드 호출


82

정적 메서드에 대한 내부 호출을 수행하는이 클래스가 있습니다.

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.


이 문제와 관련하여 별도의 스레드에 더 복잡한 답변을 게시했습니다. stackoverflow.com/a/43694337/3182819
Thomas Urban

답변:


74

인스턴스 내부에서 정적 함수를 호출하는 경우 클래스 정적 함수를 참조하는 올바른 방법은 다음과 같습니다.

this.constructor.functionName();

es6 호출 정적 메서드


11
OP는 인스턴스에서 호출하는 것에 대해 묻지 않습니다. (그가 있었다면, 당신이 링크 된 질문의 중복 것)
BERGI

그것은 대답조차 아닙니다. this.constructor.is('prod')이 경우 오류가 발생합니다.
UtkarshPramodGupta

이것은 인스턴스화 된 클래스 내부에있을 때 정적 메서드를 호출하려는 경우 솔루션 this.method()입니다. 그렇지 않으면 . 또한 수업을 확장 할 때 전화를 겁니다super.method()

54

일반 객체에서 메서드를 호출하는 것과 같습니다 . GeneralHelper.isProd()메서드 를 호출하면 메서드에서와 GeneralHelper같이 사용할 수 있으므로 사용할 this수 있습니다.

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

그러나 평소처럼 메서드가 콜백 함수로 전달되면 작동하지 않습니다 . 또한, 접근 다를 수 있습니다 GeneralHelper명시 적으로 사람이 상속을 isProd클래스 및 덮어 쓰기에서 is, InheritedHelper.isProd()다른 결과를 생성합니다.

인스턴스 메서드에서 정적 메서드를 호출하려는 경우 여기를 참조 하십시오 . 또한 정적 메서드 만 정의하는 클래스는 이상한 것이므로 대신 일반 객체를 사용하는 것이 좋습니다.


17
덕분에 나는 아주 사용 정적 컨텍스트에서 "이"키워드를 혼란 생각하지만, 어쨌든 그것을 잘 작동 것
Shlomi

6
예, PHP에서 $ this는 현재의 객체를 참조하며, 클래스 메소드 (정적)에는이 키워드가 존재하지 않습니다 ( 'self'및 최신 'static'이 있음). 내가 기억하는 한, Java에서도 "this"키워드는 정적 메소드로 사용할 수 없습니다. 이치에 맞습니다. 정적 컨텍스트에있을 때는 "this"엔티티가 없습니다. "this"는 말해야합니다. 특정 엔티티와 전체 클래스 또는 일반 작업을 참조하는 정적 메서드에 ..
Shlomi

11
JS 개발자로서 this동작 방식을 이해하는 것은 매우 중요합니다 . this다른 언어 에서처럼 작동하지 않습니다 .
loganfsmyth 2015-06-29

1
@kidwon : 생성자 호출은 메서드 호출과 매우 유사하므로 거기동일this 합니다 (슈퍼 호출 전에 사용할 수 없다는 유일한 차이점 만 있습니다 ).
Bergi

1
@kidwonconstructor(){ CLASS_NAME.STATIC_METHOD(); }
Morteza Tourani

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

아이디어는 클래스의 새 인스턴스를 만들지 않고도 정적 메서드를 호출 할 수 있다는 것입니다. 즉, 인스턴스 외부에서 호출하는 것과 동일한 방식으로 인스턴스의 메서드 내부에서 호출 할 수 있습니다.

다시 말하지만, 질문의 세부 사항이 요청한 것이 아니라 다른 사람들에게 도움이 될 수 있다는 것을 알고 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.