关于oop:在Javascript中,这个下划线是什么意思?

In Javascript, what does this underscore mean?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
var Gallery = Backbone.Controller.extend({
    _index: null,
    _photos: null,
    _album :null,
    _subalbums:null,
    _subphotos:null,
    _data:null,
    _photosview:null,
    _currentsub:null,
    routes: {
       "":"index",
       "subalbum/:id":"subindex",
       "subalbum/:id/" :"directphoto",
       "subalbum/:id/:num" :"hashphoto"
    },
    initialize: function(options) {
        var ws = this;
        if (this._index === null){
            $.ajax({
                url: 'data/album1.json',
                dataType: 'json',
                data: {},
                success: function(data) {
                    ws._data = data;
                    ws._photos =
                    new PhotoCollection(data);
                    ws._index =
                    new IndexView({model: ws._photos});
                    Backbone.history.loadUrl();
                }
            });
            return this;
        }
        return this;
    },
    //Handle rendering the initial view for the
    //application
    index: function() {
        this._index.render();
    },

我正在阅读主干网站的教程:http://addyosmani.com/blog/building-spas-jquerys-best-friends/

下划线是什么?(索引、照片、相册)为什么要使用它们?


它意味着私有字段或私有方法。只供内部使用的方法。

不应在类外部调用它们。

私有字段包含供内部使用的数据。

他们不应该从课堂外直接读或写。

需要注意的是,只向变量添加下划线不会使其成为私有的,它只是一种命名约定。


据我所知,它通常用于表示私有变量(但实际上不提供任何隐私,只是一个约定)。

这里简要讨论了这一点,但建议不要:http://javascript.crockford.com/code.html


_varname一样使用时,它只是变量名的一部分,没有javascript的含义。开发人员使用它来表示变量的含义或范围。在这种情况下,它似乎在告诉开发人员这个变量应该是局部变量或私有变量。

需要注意的几点是,在这个使用_.varname的特定示例中,这意味着使用underline.js库的变量或函数。也可以使用_varname表示包含下划线对象的变量,同样,在我们的办公室,我们使用$varname表示包含jquery对象的变量。


它可能用于标记内部/私有属性。就像在python中,用下划线前缀一个变量是一种简单的方法,可以告诉开发人员一个变量是内部的,他们最好不要篡改它(如果这样做,即使是对相关库的一个小的更新也可能会破坏它)。


通常,_用来告诉用户/程序员它是一个有问题的私有/保护变量。


这只是一个小小的补充。正如已经回答的,这些是伪私有变量。但这样就可以编写访问这些私有变量的伪公共函数。

我被一个同事的代码弄糊涂了,这个代码有效地包含了这个代码(但在一个单独的库中埋得很深):

1
2
3
4
5
class x {
  constructor(id) {this._id = id}
  get id() {return this._id}
}
let y = new x(3)

现在您有了y.idy._id,它们都可以工作并返回相同的值。但是如果你使用console.log(y),它只会显示_id键。

enter image description here


如前所述,这是许多开发人员之间的一种实践,在这方面很糟糕。如果您必须在编程方法中使用这样的约定,那么在尝试使用该语言之前,您应该先学习该语言、方法和模式。如果有人不使用"下划线"就无法区分代码中的公共/私有方法,那么您的文档技能就非常缺乏。网络上的许多公共项目都没有很好的文档记录,这可能就是为什么"强调"约定被大多数知识不足的开发人员"接受"的原因,而其他人则决定遵循流程,而不是保留正式的设计模式和方法。"下划线"没有写入ES6/7版本是有原因的。

在一篇博客中,我最近遇到了一位软件工程师经理,他说:"下划线命名约定使得一眼就能很容易地分辨出变量函数是公共的还是私有的。"我的回答是:"评论就像图片,在这种情况下,它们值一千个下划线。

有一个名为doxygen的免费文档工具。虽然它不专门支持javascript,但是当您在注释中使用doxygen前缀时,它可以为您的javascript应用程序生成专业文档。为开发人员和用户创建带有文档的JavaScript应用程序非常简单,只要在代码注释中稍加努力。

请记住,有一些工具可以删除注释,以及"产品发布"的控制台语句。也就是说,使用源地图也是浪费时间和资源。在准备发布之前不要缩小。即dev build(无缩小、保留注释和控制台语句)、release build(删除注释和控制台语句并缩小dev build)。不需要在发布质量代码时重新编译开发人员构建,只需为发布做好准备并部署它)。