替代方案是:
>一个构造函数和一个具有所有函数的原型,非API方法(private)将只用一个下划线_function_name命名,以便开发人员知道他们可以调用什么以及不能调用什么.
> API函数的构造函数和原型,私有命名空间中的私有函数的自由函数将其隐藏在除了这些命名空间之外的其余命名空间中.
我们不考虑其他方法,例如在形式为var private_var = function(){}的构造函数中创建私有函数,因为每当一个对象被实例化并且每个对象都有自己的集合时,这将触发所有这些函数的创建.
我们为他们的理由:
1
> Javascript不支持私有功能本身,实际上没有私有/受保护/公共可见性的概念,所以这基本上是一个黑客
>在方法名称中使用下划线可以清楚地标出给定类/原型的边界是什么,不需要“强制执行”它,实际上Python中没有私有方法和python用户似乎并不关心它除了使用下划线
>即使私人执行,在某种语言中,只要动态地替换公共方法,它有什么意义呢?
>影响可读性,相当多的是,私有函数被分隔成另一组大括号作为其范围,他们不能使用这个或者他们需要使用function.call(object)或function.apply(object)调用.
2
通过将私有方法封装在远离类/原型用户的手中,提供了明确的限制
>它或多或少是行业标准,很多JavaScript开发人员使用它
我们怀疑,由于许多开发人员使用它,可能还有其他原因,如性能等等.
由于我们对Javascript的了解非常有限,我们决定在stackoverflow中发布这个信息,以了解哪种方法更好,为什么.
解决方法
下划线的惯例有助于当您尝试单元测试时,您真的想分解外部可能看起来像一个巨大的方法.
我觉得在其他情况下,你应该尝试使事情变得非常私密.如果您尝试为其他人公开一个漂亮干净的API,他们不需要看到幕后的内容.为什么暴露?这导致了关于私人和公共的通知:Why “private” methods in the object oriented?
下划线约定:
function Pizza() { this._pepperoni = function () {}; }
要么
function Pizza() { } Pizza.prototype._pepperoni = function () {};
作用域
function Pizza() { function pepperoni() {}; }
命名空间/模块
var pizza = pizza || {}; (function() { function pepperoni() {}; function create() { pepperoni(); } window.pizza.create = create; // or module.export = pizza or both }());
模块模式
(function(){ function pepperoni() {}; function Pizza() { pepperoni(); } window.Pizza = Pizza; }());
关于重新创建你的函数和定义它们一次.首先,如果您想使用内部私有成员,并仍然使用“this”,只需创建一个名为self的新变量并将其分配给它:
function Pizza() { var self = this; function pep() { self.x = 1; } }
接下来,我试图测试在前面的重新定义和写入功能之间的性能差异:http://jsperf.com/private-methods我认为它可以节省你不到20%的操作/秒,以使您的功能每次重新创建.
我不推荐任何方法,它们在各种时间都是有效和有用的.有时它更多的是语义学,有时它是关于性能的,而其他时候它是像单元测试一样满足一些目的.