Префикс подчеркивания для имен свойств и методов в 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 поставляется с этой поддержкой.