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;
...
只有会议?或者下划线前缀后面还有更多?
我承认我的问题与this question非常相似,但它并没有让人更聪明地了解JavaScript中下划线前缀的重要性。
答案 0 :(得分:237)
这只是一个惯例。 Javascript语言对以下划线字符开头的标识符没有任何特殊含义。
尽管如此,对于不支持encapsulation开箱即用的语言来说,这是一个非常有用的约定。虽然没有办法阻止某人滥用你的类的实现,但至少它确实澄清了你的意图,并且首先将这些行为记录为错误。
答案 1 :(得分:93)
JavaScript实际上通过涉及hiding members in closures(Crockford)的方法支持封装。也就是说,它有时是繁琐的,并且下划线约定是一个非常好的约定,用于私有的东西,但你实际上并不需要隐藏。
答案 2 :(得分:13)
JSDoc 3允许您使用@access private
(以前为@private
标记)对您的功能进行注释,这对于向其他开发者广播您的意图非常有用 - http://usejsdoc.org/tags-access.html
答案 3 :(得分:9)
"只有会议?或者下划线前缀后面还有更多?"
除了隐私惯例之外,我还想帮助提高认识,即下划线前缀也用于依赖于独立参数的参数,特别是在URI锚图中。从属键始终指向地图。
示例(来自https://github.com/mmikowski/urianchor):
$.uriAnchor.setAnchor({
page : 'profile',
_page : {
uname : 'wendy',
online : 'today'
}
});
浏览器搜索字段中的URI锚点更改为:
\#!page=profile:uname,wendy|online,today
这是一种用于根据哈希值更改来驱动应用程序状态的约定。
答案 4 :(得分:6)
import/export
现在正在使用ES6完成工作。如果导出了大部分功能,我仍然倾向于使用_
为未导出的函数添加前缀。
如果只导出一个类(如在角项目中),则根本不需要它。
export class MyOpenClass{
open(){
doStuff()
this._privateStuff()
return close();
}
_privateStuff() { /* _ only as a convention */}
}
function close(){ /*... this is really private... */ }
答案 5 :(得分:6)