자바 스크립트에서`#`기호는 무엇을합니까?

Nov 23 2020

#표지판 이 포함 된 코드를 발견했습니다 . 그것은 무엇을 위해 사용됩니까? 코드는 다음과 같습니다.

class someObject{
  #someMethod(){
    //do something 
  }
}

답변

5 T.J.Crowder Nov 23 2020 at 20:05

이는 A의 인장 부재가 전용임을 나타낸다 (보다 오히려 운영자) -이 경우, A의 비공개 방법 뿐만 아니라 위해 사용되는 전용 필드 .

이를 선언하는 클래스 외부의 코드에서는 private 메서드 또는 private 필드를 사용할 수 없습니다. 예를 들면 :

class Example {
    doSomething() {
        this.#method("from doSomething"); // <== Works
    }
    #method(str) {
        console.log("method called: " + str);
    }
}
const e = new Example();
e.doSomething();
e.#method(); // <=== FAILS
3 Mr.Alien Nov 23 2020 at 20:05

이것은 실험적인 제안입니다. 다음을 사용하여 비공개 JavaScript 메서드를 정의 할 수 있습니다.#

자세한 내용은 MDN 문서를 참조하세요.

클래스 속성은 기본적으로 공용이며 클래스 외부에서 검사하거나 수정할 수 있습니다. 그러나 해시 접두사를 사용하여 개인 클래스 필드를 정의 할 수 있는 실험적인 제안 이 #있습니다.


ES5를 사용하여 비슷한 것을 달성 할 수 있습니다 (단순하게 설명하기 위해). 여기서 Private 메서드 (JavaScript에는 기본적으로없는 메서드)와 같은 것을 시뮬레이션 할 수 있습니다.

예를 들면 :

function someObj() { //assuming this is a class definition
  function someMethod() { //private method which is not accessible outside someObj

  }

  function init() { //initializes some methods or code, private methods can be used here
    someMethod();
  }

  return {
    init //only exposes the init method outside
  }
}

위의 경우 으로 호출 될 수있는 의 init메서드 만 노출 되지만 부모 메서드 외부에서는 액세스 할 수 없습니다.someObjsomeObj.init()someMethod

예:

someObj.init(); //works
someObj.someMethod(); //won't be accessible
1 Jondi Nov 23 2020 at 20:08

해시는 개인 클래스 필드를 정의하는 데 사용됩니다.