属性和方法名的下划线前缀仅仅是一种约定吗?

下划线前缀在JavaScript中只是一种约定吗,就像在Python私有类方法中一样?

来自2.7 Python文档:

"私有"实例变量 只能从内部进入 对象在Python中不存在。 然而,有一个惯例是这样的 后跟大多数Python代码:一个名称 以下划线作为前缀(例如 _spam)应该被视为API的非公开部分(不管它是 函数、方法还是数据 成员). < / p >

这也适用于JavaScript吗?

以下面的JavaScript代码为例:

function AltTabPopup() {
this._init();
}


AltTabPopup.prototype = {
_init : function() {
...
}
}

此外,还使用下划线前缀变量。

    ...
this._currentApp = 0;
this._currentWindow = -1;
this._thumbnailTimeoutId = 0;
this._motionTimeoutId = 0;
...

唯一的约定吗?或者下划线前缀后面还有更多?


我承认我的问题与这个问题非常相似,但它并没有使人们更聪明地认识到JavaScript中下划线前缀的重要性。

236141 次浏览

这只是惯例。Javascript语言没有为以下划线开头的标识符赋予任何特殊含义。

也就是说,对于一种不支持封装开箱即用的语言来说,这是一个非常有用的约定。虽然没有办法防止有人滥用你的类的实现,但至少它明确了你的意图,并记录了诸如错误的这样的行为。

JavaScript实际上是支持封装的,通过一个包含在闭包中隐藏成员 (Crockford)的方法。也就是说,它有时很麻烦,而下划线约定是一个非常好的约定,用于某种私有的东西,但你实际上没有需要隐藏。

JSDoc 3允许你用@access private(以前是@private标签)注释你的函数,这对于向其他开发人员传播你的意图也很有用——http://usejsdoc.org/tags-access.html

“唯一的约定吗?或者下划线前缀后面还有其他含义?”

除了隐私约定之外,我还想帮助大家认识到,下划线前缀也用于依赖于独立参数的参数,特别是在URI锚点映射中。依赖键总是指向一个映射。

示例(来自https://github.com/mmikowski/urianchor):

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

浏览器搜索字段的URI锚被更改为:

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

这是一种约定,用于基于散列更改驱动应用程序状态。

import/export现在在ES6中做这项工作。如果我的大部分函数都导出了,我仍然倾向于用_作为未导出函数的前缀。

如果你只导出一个类(比如在angular项目中),它根本就不需要。

export class MyOpenClass{


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


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


}


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

欢迎来到2019年!

似乎接受了建议扩展类语法以允许#前缀变量为私有。Chrome 74 船只与此支持。

_前缀变量名被认为是私有的,但仍然是公共的。

这种语法试图既简洁又直观,尽管它与其他编程语言有很大不同。

为什么在所有的Unicode代码点中选择#符号?

  • @最初是最受欢迎的,但它被装饰师拿走了。TC39考虑交换装饰符和私有状态符号,但委员会决定沿用现有的转译器用户的用法。
  • _将导致与现有JavaScript代码的兼容性问题,这使得_在标识符或(公共)属性名的开始很长一段时间。
2017年7月,该提案进入第三阶段。从那时起,人们对各种替代方案进行了广泛的思考和冗长的讨论。 最后,这个思考过程和持续的社区参与导致了对这个存储库中的提案的重新共识。基于这一共识,该提案的实现正在向前推进

看到https://caniuse.com/#feat=mdn-javascript_classes_private_class_fields