Префикс подчеркивания для имен свойств и методов в JavaScript

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

Из документации 2.7 Python:

"Private" переменные экземпляра, которые невозможно получить доступ, кроме как изнутри объект не существует в 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.

Ответ 1

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

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

Ответ 2

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

Ответ 3

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

Ответ 4

"Только условности? Или есть еще один префикс подчеркивания?"

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

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

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

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

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

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

Ответ 5

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

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

export class MyOpenClass{

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

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

}

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

Ответ 6

Следует отметить, что существует JS-библиотека под названием подчеркивание. При использовании этой библиотеки префикс _ имеет значение.

http://underscorejs.org/

Ответ 7

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

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