Javascript 为什么谷歌';s闭包库不使用真正的私有成员?

Javascript 为什么谷歌';s闭包库不使用真正的私有成员?,javascript,Javascript,我从事JavaScript开发已有一段时间了,我一直认为在JavaScript中实现私有成员的正确方法是使用Doug Crockford在这里概述的技术: 我并不认为这是一个特别有争议的JavaScript智慧,直到我开始使用Google闭包库。想象一下我的惊讶。。。该库不使用Crockford样式的信息隐藏。他们所做的只是使用一种特殊的命名约定,并在文档中注明“private”成员。我习惯于假设谷歌的员工通常处于软件质量的领先地位,那么,他们会给出什么呢?遵循Crockford先生的建议有什么

我从事JavaScript开发已有一段时间了,我一直认为在JavaScript中实现私有成员的正确方法是使用Doug Crockford在这里概述的技术:


我并不认为这是一个特别有争议的JavaScript智慧,直到我开始使用Google闭包库。想象一下我的惊讶。。。该库不使用Crockford样式的信息隐藏。他们所做的只是使用一种特殊的命名约定,并在文档中注明“private”成员。我习惯于假设谷歌的员工通常处于软件质量的领先地位,那么,他们会给出什么呢?遵循Crockford先生的建议有什么不明显的缺点吗?

主流JavaScript库中有很多伪隐私的例子。Facebook Connect的JavaScript库具有相同的结构

开发人员走这条路线的主要原因是为了性能。在闭包中隐藏内容可能会更慢,并且会占用更多内存。闭包隐藏也不太灵活,因为真正的隐私不能在没有闭包的文件之间传递。在我看来,闭包隐藏在概念上更为纯粹,但是当性能成为一个问题时,使用伪隐私是一种可行的方法


另一个原因是,很多Google程序员都有Python的背景,在Python中没有私有的anythings,下划线前缀是公认的社区标准。

JSDOC符号还有很多不尽如人意的地方——当您使用Google闭包编译器时,这些“@private”标记会被解析并强制执行。如果任何外部对象试图访问其中一个变量,将生成编译错误。事实上,他们在哲学上反对一般的Crockford继承模式:

他们使用goog.inherit()和goog.base()的继承模型只是将原型成员从超类复制到子类

您可以看到Doug Crockford的sugar函数也有相同的功能。我个人在继承特权成员(this.property)时遇到了很多问题


两种继承方法,私有变量只是消失,不像C++或java,在那里你没有访问超类的私有成员,但它们仍然是继承的。这一定是他们喜欢这种方法的主要原因。

私有闭包中的变量在调试时也是个麻烦:p.还有一种哲学,Javascript不是真正的OO语言,也不是“天生的”(因为我想不出更好的词)支持私有变量。像Firebug这样的工具提供了对整个范围链的访问,因此您可以看到“私有”变量。我有时会将一个名为
.debug()
的方法附加到具有私有成员的模块上,这只会触发一个
调试器语句并打开闭包进行检查(这就像碰到断点一样)。请参阅注释中的讨论以了解我的意见