2010-12-19 86 views
153

JavaScript中的下划线前缀只是一个约定,就像例如在Python私有类方法中那样?JavaScript中属性和方法名的下划线前缀

从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

另请参阅http://stackoverflow.com/questions/17359885/defining-properties-and-naming-conventions-in-javascript – 2013-06-28 15:54:42

回答

187

这只是一个约定。 Javascript语言对以下划线字符开头的标识符没有任何特殊含义。

这就是说,对于不支持encapsulation的语言而言,这是一种非常有用的惯例。尽管没有办法阻止某人滥用您的课程实施,但至少它确实会阐明您的意图,并且首先记录错误的等行为。

+4

是的。即使语言不“支持”它,它也是一个非常方便的约定。 – 2010-12-19 18:47:35

+0

严重的概率。 http://jsfiddle.net/VmFSR/ 正如你在那里看到的那样,值创建的名字只能通过在'_'前面添加新值来创建,我很想知道发生了什么!?为什么它不是'this.name'呢? – 2013-07-26 23:14:33

+1

@Muhammad Umer,我不确定我是否理解你的评论。 'console.log(someone._name =“Jean Dupont”);'和'console.log(someone.name);'一样工作,它既指派又评估属性后面带下划线的前缀成员。 [你可以看到](http://jsfiddle.net/VmFSR/1/),theres没有保证封装通过下划线:) – 2013-07-26 23:25:45

80

JavaScript实际上确实支持封装,通过涉及hiding members in closures(Crockford)的方法。也就是说,这有时很麻烦,下划线约定是一种非常好的约定,用于私人事物,但实际上您并不需要来隐藏。

+15

投票澄清如何实现封闭,反对说下划线是良好的惯例。所以我不会以任何一种方式投票:) – Jason 2011-06-17 03:14:18

+3

隐藏成员关闭有时会妨碍可测试性。看看这篇文章:http://www.adequatelygood.com/2010/7/Writing-Testable-JavaScript – 2013-02-05 18:46:31

+3

@Jason - 只是好奇,为什么你考虑强调一个不好的约定? – 2013-05-21 14:57:40

7

“只有约定或者是有更多的背后下划线前缀?“

除了隐私约定,我还希望帮助人们认识到下划线前缀也用于依赖于独立参数的参数,特别是在URI锚点地图中。从属关键字始终指向地图。

例(从https://github.com/mmikowski/urianchor):

$ .uriAnchor.setAnchor({ 页: '个人资料', _page:{ UNAME: '温迪', 在线: '今天' }} ) ;

在浏览器搜索字段中的URI锚改为:

#页=简介:UNAME,温迪|在线,今天

这是用来驱动的应用程序状态的约定基于哈希变化。

1

应该指出的是有一个名为下划线的JS库。使用该库时,_前缀确实有意义。

http://underscorejs.org/

+0

...但我没有问在这方面的问题... – 2016-12-21 22:22:15

+0

下划线库对这个问题没有任何意义,虽然不错,但插件;) – Shanimal 2017-07-26 23:07:52

1

import/export现在正在做与ES6的工作。如果我的大多数函数都被导出,我仍然倾向于用_的前缀未输出函数。

如果只导出一个类(如在角项目中),则根本不需要。