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

2022-08-30 00:15:35

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

只有约定?还是下划线前缀后面还有更多?


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


答案 1

这只是一个惯例。Javascript语言不会给以下划线字符开头的标识符任何特殊含义。

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


答案 2

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