Подчеркнуть префикс для имен свойств и методов в JavaScript - PullRequest
208 голосов
/ 19 декабря 2010

Является ли префикс подчеркивания в JavaScript только соглашением, как, например, в методах закрытых классов Python?

Из документации 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.

Ответы [ 6 ]

239 голосов
/ 19 декабря 2010

Это всего лишь соглашение.Язык Javascript не придает особого значения идентификаторам, начинающимся с символов подчеркивания.

Тем не менее, это довольно полезное соглашение для языка, который не поддерживает инкапсуляцию из коробки.Хотя нет никакого способа предотвратить злоупотребление реализациями ваших классов, по крайней мере, это проясняет ваши намерения и документирует такое поведение, как неправильное , во-первых.

95 голосов
/ 22 декабря 2010

JavaScript на самом деле поддерживает инкапсуляцию с помощью метода, который включает сокрытие членов в замыканиях (Крокфорд). Тем не менее, это иногда громоздко, и соглашение о подчеркивании является довольно хорошим соглашением, которое можно использовать для вещей, которые являются частными, но на самом деле вам не нужно , чтобы скрыть.

13 голосов
/ 16 мая 2012

JSDoc 3 позволяет комментировать ваши функции с помощью @access private (ранее тег @private), который также полезен для передачи ваших намерений другим разработчикам - http://usejsdoc.org/tags-access.html

9 голосов
/ 26 августа 2014

«Только условные обозначения? Или есть префикс подчеркивания?»

Помимо соглашений о конфиденциальности, я также хотел помочь осознать, что префикс подчеркивания также используется для аргументовкоторые зависят от независимых аргументов, особенно в картах привязки URI.Зависимые ключи всегда указывают на карту.

Пример (из https://github.com/mmikowski/urianchor):

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

Привязка URI в поле поиска браузера изменяется на:

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

Это соглашение, используемое для управления состоянием приложения на основе изменений хеша.

7 голосов
/ 19 мая 2019

Добро пожаловать в 2019!

Представляется предложение о расширении синтаксиса класса, чтобы разрешить _ именам префиксных переменных быть общедоступными и # именами с префиксами, частными были приняты. Chrome 74 поставляется с этой поддержкой.

7 голосов
/ 24 марта 2017

import/export теперь выполняет работу с ES6.Я все еще склоняюсь к префиксу неэкспортируемых функций с _, если экспортируется большинство моих функций.

Если вы экспортируете только класс (как в угловых проектах), он вообще не нужен.

export class MyOpenClass{

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

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

}

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