[javascript] JavaScript에서 속성 및 메서드 이름의 밑줄 접두사

JavaScript의 밑줄 접두어는 예를 들어 Python 개인 클래스 메소드와 같은 규칙입니까?

2.7 파이썬 문서에서 :

객체 내부를 제외하고는 액세스 할 수없는“비공개”인스턴스 변수는 Python에 없습니다. 그러나 대부분의 Python 코드가 따르는 규칙이 있습니다. 밑줄 (예 : _spam)이 접두어로 붙은 이름은 API의 비공개 부분으로 간주되어야합니다 (함수, 메소드 또는 데이터 멤버인지 여부) .

이것은 JavaScript에도 적용됩니까?

이 JavaScript 코드를 예로 들어 보겠습니다.

function AltTabPopup() {
    this._init();
}

AltTabPopup.prototype = {
    _init : function() {
        ...
    }
}

또한 밑줄 접두사 변수가 사용됩니다.

    ...
    this._currentApp = 0;
    this._currentWindow = -1;
    this._thumbnailTimeoutId = 0;
    this._motionTimeoutId = 0;
    ...

컨벤션 만? 아니면 밑줄 접두어 뒤에 더 있습니까?


내 질문은 이 질문 과 매우 유사하다는 것을 인정 하지만 JavaScript에서 밑줄 접두어의 중요성에 대해 더 똑똑하게 만들지는 않았습니다.



답변

2019 년에 오신 것을 환영합니다!

그것은 나타납니다 제안 을 허용하는 클래스 구문을 확장 #받아 들여졌다 비공개 앞에 붙 변수를. (74 개) 크롬 선박 이 지원합니다.

_ 접두사가 붙은 변수 이름은 규칙에 따라 개인용으로 간주되지만 여전히 공용입니다.

이 문법은 다른 프로그래밍 언어와는 다르지만 간결하고 직관적입니다.

모든 유니 코드 코드 포인트 중에서 왜 sigil #을 선택 했습니까?

  • @는 처음에 좋아했지만 데코레이터가 가져 왔습니다. TC39는 데코레이터와 개인 주정부 교환을 고려했지만,위원회는 기존의 트랜스 필러 사용자 사용을 연기하기로 결정했습니다.
  • _은 (는) 식별자 또는 (공용) 속성 이름을 처음 시작할 때 _를 허용 한 기존 JavaScript 코드와의 호환성 문제를 유발합니다.

이 제안은 2017 년 7 월 3 단계에 도달했습니다. 그 이후로 다양한 대안에 대한 광범위한 생각과 긴 토론이있었습니다. 결국,이 사고 과정과 지속적인 커뮤니티 참여는이 저장소의 제안에 대한 새로운 합의로 이어졌습니다. 이러한 합의에 따라 구현이이 제안에 따라 진행되고 있습니다.

https://caniuse.com/#feat=mdn-javascript_classes_private_class_fields를 참조 하십시오.


답변

그건 컨벤션 일뿐입니다. Javascript 언어는 밑줄 문자로 시작하는 식별자에 특별한 의미를 부여하지 않습니다.

즉, 기본적으로 캡슐화 를 지원하지 않는 언어에 대해서는 매우 유용한 규칙입니다 . 누군가 클래스의 구현을 남용하는 것을 막을 방법은 없지만, 적어도 의도를 명확히 하고 처음에는 잘못된 행동을 문서화 합니다.


답변

JavaScript는 실제로 멤버를 클로저 (Crockford) 에 숨기는 방법을 통해 캡슐화를 지원 합니다. 즉, 때로는 성가 시며 밑줄 표기법은 사적인 것들에 사용하기에는 아주 좋은 표기법이지만 실제로 숨길 필요 는 없습니다 .


답변

JSDoc 3 당신이와 기능에 주석 할 수 있습니다 @access private(이전 @private– 다른 개발자에 당신의 의도를 방송을 위해 유용 태그) http://usejsdoc.org/tags-access.html를


답변

“컨벤션 만? 또는 밑줄 접두어 뒤에 더 있습니까?”

개인 정보 보호 규칙 외에도 밑줄 접두어가 독립적 인 인수, 특히 URI 앵커 맵에서 종속 된 인수에 사용된다는 사실을 인식하고 싶었습니다. 종속 키는 항상 맵을 가리 킵니다.

예 ( https://github.com/mmikowski/urianchor ) :

$.uriAnchor.setAnchor({
  page   : 'profile',
  _page  : {
    uname   : 'wendy',
    online  : 'today'
  }
});

브라우저 검색 필드의 URI 앵커가 다음으로 변경되었습니다.

\#!page=profile:uname,wendy|online,today

이것은 해시 변경을 기반으로 응용 프로그램 상태를 구동하는 데 사용되는 규칙입니다.


답변

import/export이제 ES6에서 작업을 수행하고 있습니다. 나는 여전히 내 보내지 않은 함수를 접두사로 사용하는 경향이 있습니다._내 함수의 대부분을 내 있습니다.

각도 프로젝트에서와 같이 클래스 만 내 보내면 전혀 필요하지 않습니다.

export class MyOpenClass{

    open(){
         doStuff()
         this._privateStuff()
         return close();
    }

    _privateStuff() { /* _ only as a convention */}

}

function close(){ /*... this is really private... */ }


답변