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

时间:2010-12-19 18:27:13

标签: javascript scope naming-conventions

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中下划线前缀的重要性。

6 个答案:

答案 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)

欢迎来到2019!

似乎proposal扩展了类语法,以允许select datediff(week, dateadd(week, datediff(week, 0, dateadd(month, datediff(month, 0, @date), 0)), 0), @date - 1) + 1 前缀的变量名是public,而_前缀的变量名是private。具有此支持的Chrome 74 ships