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... */ }