web-dev-qa-db-ja.com

JavaScriptのプロパティおよびメソッド名のアンダースコアプレフィックス

JavaScriptのアンダースコアプレフィックスは、たとえばPythonプライベートクラスメソッドのように、単なる規則ですか?

2.7 Pythonドキュメントから:

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でのアンダースコアプレフィックスの重要性について賢くはしませんでした。

205
Kenny Meyer

2019へようこそ!

クラスの構文を拡張して、_プレフィックス付き変数名をパブリックにし、#プレフィックス付き変数名を許可する 提案 が表示されます。プライベートが受け入れられました。 Chrome 74 ships このサポート付き。

7
Karuhanga

それは単なる慣例です。 Javascript言語は、アンダースコア文字で始まる識別子に特別な意味を与えません。

とは言っても、 encapsulation をサポートしていない言語にとっては非常に便利な規則です。誰かがあなたのクラスの実装を乱用するのを防ぐ方法はありませんが、少なくともあなたの意図を明確にし、wrong最初の場所。

237

JavaScriptは、実際には、 クロージャー内のメンバーの非表示 (Crockford)を含むメソッドを通じて、カプセル化をサポートします。そうは言っても、面倒な場合があり、アンダースコアの規則は、プライベートなものに使用するのに非常に良い規則ですが、実際には必要ありませんneed 隠れる。

94
Zach

JSDoc 3では、関数に@access private(以前は@privateタグ)で注釈を付けることができます。これは、他の開発者に意図をブロードキャストするのにも役立ちます- http://usejsdoc.org/tags-access.html

13
philrabin

「慣習だけですか?それとも、アンダースコア接頭辞の後ろにもっとありますか?」

プライバシー規約とは別に、アンダースコアプレフィックスは、特にURIアンカーマップにおいて、独立した引数に依存する引数にも使用されることを認識できるようにしたかったのです。依存キーは常にマップを指します。

例(from https://github.com/mmikowski/urianchor ):

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

ブラウザの検索フィールドのURIアンカーは次のように変更されます。

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

これは、ハッシュの変更に基づいてアプリケーションの状態を駆動するために使用される規則です。

9
Sam Araiza

import/exportはES6で仕事をしています。ほとんどの関数がエクスポートされている場合、エクスポートされていない関数の前に_を付ける傾向があります。

クラス(angularプロジェクトなど)のみをエクスポートする場合は、まったく必要ありません。

export class MyOpenClass{

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

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

}

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