首页 文章

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

提问于
浏览
186

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;
    ...

只有 Session ?或者下划线前缀后面还有更多?


我承认我的问题与this question非常相似,但它并没有让人更聪明地了解JavaScript中下划线前缀的重要性 .

6 回答

  • -5

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

    也就是说,'s quite a useful convention for a language that doesn' t支持encapsulation开箱即用 . 虽然没有办法阻止某人滥用你的类的实现,但至少它确实澄清了你的意图,并且首先将这种行为记录为错误 .

  • 90

    JavaScript实际上通过涉及hiding members in closures(Crockford)的方法支持封装 . 那就是说,它实际上需要隐藏起来 .

  • 8

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

  • 221

    “只有约定?或者下划线前缀后面还有更多?”

    除了隐私约定之外,我还想帮助意识到下划线前缀也用于依赖于独立参数的参数,特别是在URI锚图中 . 从属键始终指向 Map .

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

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

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

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

    这是用于基于散列更改来驱动应用程序状态的约定 .

  • 13

    import/export 现在正在使用ES6完成工作 . 如果我的大部分功能都被导出,我仍然倾向于使用 _ 前缀不导出的函数 .

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

    export class MyOpenClass{
    
        open(){
             doStuff()
             this._privateStuff()
             return close();
        }
    
        _privateStuff() { /* _ only as a convention */} 
    
    }
    
    function close(){ /*... this is really private... */ }
    
  • 4

    应该指出的是,有一个名为下划线的JS库 . 使用该库时,_前缀确实具有重要性 .

    http://underscorejs.org/

相关问题