JavaScript中属性和方法名称的下划线前缀

JavaScript中属性和方法名称的下划线前缀,javascript,scope,naming-conventions,Javascript,Scope,Naming Conventions,JavaScript中的下划线前缀是否只是一种约定,比如Python中的私有类方法 从2.7 Python文档中: “私有”实例变量 只能从内部访问 Python中不存在对象。 然而,有一个惯例是 后面是大多数Python代码:名称 以下划线作为前缀(例如。 _垃圾邮件)应被视为API的非公开部分(无论是否 是函数、方法还是数据 成员) 这是否也适用于JavaScript 以下面的JavaScript代码为例: function AltTabPopup() { this._init();

JavaScript中的下划线前缀是否只是一种约定,比如Python中的私有类方法

从2.7 Python文档中:

“私有”实例变量 只能从内部访问 Python中不存在对象。 然而,有一个惯例是 后面是大多数Python代码:名称 以下划线作为前缀(例如。 _垃圾邮件)应被视为API的非公开部分(无论是否 是函数、方法还是数据 成员)

这是否也适用于JavaScript

以下面的JavaScript代码为例:

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

AltTabPopup.prototype = {
    _init : function() {
        ...
    }
}
此外,还使用下划线前缀变量

    ...
    this._currentApp = 0;
    this._currentWindow = -1;
    this._thumbnailTimeoutId = 0;
    this._motionTimeoutId = 0;
    ...
只有惯例?或者下划线前缀后面还有其他内容吗



我承认我的问题与之非常相似,但这并没有让人更清楚JavaScript中下划线前缀的重要性。

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


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

这只是一种惯例。Javascript语言对以下划线字符开头的标识符没有任何特殊意义


也就是说,对于不支持开箱即用的语言来说,这是一个非常有用的约定。尽管没有办法防止有人滥用您的类的实现,但至少它确实澄清了您的意图,并且首先记录了此类行为是错误的。

JavaScript实际上通过一种涉及(Crockford)的方法支持封装。这就是说,它有时很麻烦,下划线约定是一个非常好的约定,用于某种私有的东西,但实际上不需要隐藏。JavaScript确实支持封装,通过一种涉及(Crockford)的方法。这就是说,它有时很麻烦,下划线约定是一种非常好的约定,用于某种私有的东西,但实际上不需要隐藏。

JSDoc 3允许您使用
@access private
(以前是
@private
标记)注释函数这对于向其他开发人员广播您的意图也很有用-

JSDoc 3允许您使用
@access private
(以前是
@private
标记)注释您的函数,这对于向其他开发人员广播您的意图也很有用-

“只有约定?还是下划线前缀后面还有其他约定?”

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

示例(来自):

浏览器搜索字段上的URI定位更改为:

\#!page=profile:uname,wendy|online,today
这是一种用于根据哈希更改驱动应用程序状态的约定

“只有约定?还是下划线前缀后面还有其他约定?”

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

示例(来自):

浏览器搜索字段上的URI定位更改为:

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

这是一种用于根据哈希更改驱动应用程序状态的约定。

import/export
现在正在使用ES6执行此任务。如果我的大多数函数都已导出,我仍然倾向于在未导出的函数前面加上

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

export class MyOpenClass{

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

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

}

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

import/export
现在正在使用ES6完成这项工作。如果我的大多数函数都已导出,我仍然倾向于在未导出的函数前面加上

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

export class MyOpenClass{

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

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

}

function close(){ /*... this is really private... */ }
欢迎来到2019年

它似乎是一种扩展类语法的方法,以允许
#
前缀变量为私有变量。铬74与此支持

\
前缀变量名按惯例被认为是私有的,但仍然是公共的

这种语法力求简洁直观,尽管它与其他编程语言有很大不同

为什么在所有Unicode代码点中选择了sigil

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

请参见

欢迎来到2019年

它似乎是一种扩展类语法的方法,以允许
#
前缀变量为私有变量。铬74与此支持

\
前缀变量名按惯例被认为是私有的,但仍然是公共的

这种语法力求简洁直观,尽管它与其他编程语言有很大不同

为什么在所有的t中选择了这个标志