Является ли префикс подчеркивания в 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.
источник
Ответы:
Добро пожаловать в 2019!
Похоже, было предложено расширить синтаксис класса, чтобы
#
префиксная переменная была закрытой. Chrome 74 поставляется с этой поддержкой._
Имена префиксных переменных считаются закрытыми по соглашению, но по-прежнему общедоступны.Смотрите https://caniuse.com/#feat=mdn-javascript_classes_private_class_fields
источник
Это всего лишь соглашение. Язык Javascript не придает особого значения идентификаторам, начинающимся с символов подчеркивания.
Тем не менее, это довольно полезное соглашение для языка, который не поддерживает инкапсуляцию из коробки. Хотя нет никакого способа предотвратить злоупотребление реализациями ваших классов, по крайней мере, это проясняет ваши намерения и в первую очередь документирует такое поведение как неправильное .
источник
_
я хотел бы знать, что происходит !? почему это неthis.name
вместо этого?console.log(someone._name = "Jean Dupont");
работает так же, какconsole.log(someone.name);
и он, и назначает и оценивает элемент с префиксом подчеркивания за свойством. Как видите , theres нет гарантированной инкапсуляции через подчеркивание :)JavaScript на самом деле поддерживает инкапсуляцию с помощью метода, который включает в себя сокрытие членов в замыканиях (Крокфорд). Тем не менее, это иногда громоздко, и соглашение о подчеркивании является довольно хорошим соглашением для вещей, которые являются частными, но которые вам на самом деле не нужно скрывать.
источник
JSDoc 3 позволяет вам аннотировать ваши функции с помощью
@access private
(ранее@private
тега), который также полезен для передачи ваших намерений другим разработчикам - http://usejsdoc.org/tags-access.htmlисточник
Помимо соглашений о конфиденциальности, я также хотел помочь осознать, что префикс подчеркивания также используется для аргументов, которые зависят от независимых аргументов, в частности в картах привязки URI. Зависимые ключи всегда указывают на карту.
Пример (из https://github.com/mmikowski/urianchor ):
Якорь URI в поле поиска браузера изменяется на:
Это соглашение используется для управления состоянием приложения на основе изменений хеша.
источник
import/export
сейчас делает работу с ES6. Я все еще склоняюсь к префиксу не экспортируемых функций,_
если большинство моих функций экспортируется.Если вы экспортируете только класс (как в угловых проектах), он вообще не нужен.
источник