我一直是JavaScript开发人员,我一直认为在JavaScript中实现私有成员的正确方法是使用Doug Crockford概述的技术:http://javascript.crockford.com/private.html。
在我开始使用Google Closure库之前,我认为这不是一个特别有争议的JavaScript智慧。想象一下我的惊喜......图书馆不遗余力地使用Crockford风格的信息隐藏。他们所做的只是使用特殊的命名约定,并在文档中注明“私人”成员。我习惯于假设谷歌的人通常处于软件质量的前沿,那么是什么呢?遵循克罗克福德先生的建议是不是有一些不利之处?
答案 0 :(得分:8)
主流JavaScript库中有很多伪隐私的例子。 Facebook Connect的JavaScript库具有相同的结构。
开发人员走这条路的主要原因是性能。隐藏在闭包中的东西可能会更慢并且使用更多内存。关闭隐藏也可能不那么灵活,因为没有some clever hacks的文件之间不能进行真正的隐私。关闭隐藏在概念上更纯粹,IMO,但是当性能受到关注时,使用伪隐私是可行的方法。
另一个原因是许多Google程序员都有Python背景,其中没有私有任何东西,下划线前缀是公认的社区标准。
答案 1 :(得分:1)
使用goog.inherit()和goog.base()的继承模型只是将原型成员从超类复制到子类。
你可以看到Doug Crockford的 sugar 功能也是如此。在继承特权成员(this.property)时,我个人遇到了很多问题。
使用这两种继承方法,私有变量就会消失,因为与C ++或Java不同,您无法访问超类的私有成员,但它们仍然是继承的。这是他们更喜欢这种方法的主要原因。
答案 2 :(得分:0)
JSDOC表示法还有更多内容 - 当您使用谷歌闭包编译器时,这些“@private”标记被解析和强制执行。如果任何外部对象尝试访问其中一个变量,则会生成编译错误。事实上,他们确实对一般的克罗克福德继承模式抱有哲学上的反对意见:http://www.bolinfest.com/javascript/inheritance.php