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


241

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에서 밑줄 접두어의 중요성에 대해 더 똑똑하게 만들지는 않았습니다.


답변:


33

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

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

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

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

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

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

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

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


257

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

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


4
예. 언어가 "지원"하지 않더라도 실제로 사용하기에 편리한 규칙입니다.
Juho Vepsäläinen

심각한 문제. jsfiddle.net/VmFSR 보시다시피, 값 생성 이름은 새로운 값을 접두사로 만 생성 _하고 무슨 일이 일어나고 있는지 알고 싶습니다! 왜 this.name대신 그렇지 않습니까?
Muhammad Umer

1
@ Muhammad Umer, 나는 당신의 의견을 이해하지 못합니다. console.log(someone._name = "Jean Dupont");뿐만 아니라 작동하며 console.log(someone.name);속성 뒤에 밑줄이 붙은 밑줄이있는 멤버를 할당하고 평가합니다. 보다시피 , 밑줄을 통한 캡슐화 보장은 없습니다 :)
Frédéric Hamidi

3
기본적으로 Visual Studio는이를 존중하도록 도와줍니다. Javascript IntelliSense 엔진은 "this"변수를 사용할 때 개체 내부에서 "개인"속성을 표시합니다. 그러나 외부에서 호출하면 모든 밑줄 속성을 숨 깁니다.
foxontherock

1
@Karuhanga 그는 2010 년에 이것을 다시 답했습니다-물론 상황은 10 년 후에 바뀌 었습니다
Kenny Meyer

99

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


19
마감을 달성하는 방법을 분명히 밝힌 표결, 밑줄을 표명하는 표결은 좋은 관례입니다. 그래서 나는 어느 쪽이든 투표하지 않을 것입니다 :)
Jason

3
클로저에 멤버를 숨기면 때로는 테스트 가능성을 방해 할 수 있습니다. :이 문서 확인 adequatelygood.com/2010/7/Writing-Testable-JavaScript
자크 Lysobey

4
@Jason-궁금한 점은 왜 밑줄을 나쁜 규칙이라고 생각하십니까?
Tamás Pap

5
@TamasPap-몇 가지 이유, 그러나 나의 선택 : 1) JS를 다른 언어 스타일로 강제하는 버팀목 2) 접근 가능한 경우, 사용됩니다. 밑줄은 외부 코드를 어지럽히고 복잡하게 만들 수 있습니다. 3) 새로운 JS 프로그래머에게 혼란.
Jason

9
클로저를 사용하더라도 기술적으로 소위 "개인"변수에 액세스 할 수 있습니다. _convention은 최소한 개발자가 자신의 위험 (또는 이와 유사한 것)으로 그렇게하도록 알립니다.
sarink


10

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

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

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

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

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

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

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


8

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

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

export class MyOpenClass{

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

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

}

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

수입 / 수출은 어떤 식 으로든 개인 클래스 메소드를 지원한다고 생각하지 않습니다. 그것은 클래스 수준에서 비슷한 기능을 지원하지만 포함 된 메소드를 숨기는 것을 제공하지는 않습니다. (즉, 포함 된 모든 메소드는 항상 공개)
bvdb

클래스와 내부 함수 호출을 함수 외부로 내 보냅니다. 이 기능은 개인용입니다.
Nicolas Zozol
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.