在Javascript中强制执行私有方法是个好主意吗?

Ark*_*nez 11 javascript oop methods styles

我正与一位开发人员讨论是否有意识地侵入javascript私有函数.

替代方案是:

  1. 具有所有函数的构造函数和原型,非API方法(私有)将使用下划线命名,_function_name以便开发人员知道他们可以调用什么以及他们不能调用什么.
  2. API函数的构造函数和原型,以及作为私有命名空间内的私有函数的自由函数,除了这一个之外,它们将其隐藏在其他命名空间中.

我们不考虑其他方法,比如在表单的构造函数中创建私有函数,var private_var= function(){}因为每次对象实例化时都会触发所有这些函数的创建,并且每个对象都有自己的集合.

我们为他们提供的理由:

1

  • Javascript本身不支持私有函数,事实上,没有私有/受保护/公共可见性的概念,所以这基本上是一个hack
  • 在方法名称中使用下划线清楚地标记了给定类/原型的边界,不需要"强制"它,事实上像Python这样的语言没有私有方法,python用户似乎从不关心它从使用下划线
  • 即使私有被强制执行,它在一种语言中有什么意义,你可以动态地替换公共方法?
  • 影响可读性,相当多,私有函数被分成另一组括号,它们的范围,它们不能使用this或者它们需要被调用function.call(object)或者function.apply(object)

2

  • 通过封装远离类/原型用户手的私有方法带来明显的限制
  • 它或多或少是行业标准,许多javascript开发人员都是这样使用它的

我们怀疑,因为很多开发人员使用它,可能还有其他原因,比如性能等,就像这样使用.

由于我们对Javascript的了解非常有限,我们决定在stackoverflow中发布这个,以了解哪种方法更好,为什么.

Par*_*ris 5

您将如何侵入javascript私有函数?目的是什么?

我认为创建类,私有函数等的不同方法取决于您的动机。

下划线约定在您尝试进行单元测试时确实很有用,并且您确实想从外部分解看起来很庞大的方法。

我觉得在任何其他情况下,您都应该尝试将事情真正做到私密。如果您试图向他人公开一个很好的,干净的API,以便他人使用,则无需查看幕后情况。为什么要揭露那个?这导致了关于私有和公共的普遍争论:为什么在面向对象中使用“私有”方法?

对于私有化方法,您确实有一些选择,其中一些选择会影响性能。

下划线约定:

function Pizza() {
   this._pepperoni = function () {};
}
Run Code Online (Sandbox Code Playgroud)

要么

function Pizza() {
}

Pizza.prototype._pepperoni = function () {};
Run Code Online (Sandbox Code Playgroud)

范围界定

function Pizza() {
    function pepperoni() {};
}
Run Code Online (Sandbox Code Playgroud)

命名空间/模块

var pizza = pizza || {};
(function() {
    function pepperoni() {};
    function create() {
        pepperoni();
    }
    window.pizza.create = create; // or module.export = pizza or both
}());
Run Code Online (Sandbox Code Playgroud)

模块模式

(function(){
    function pepperoni() {};
    function Pizza() {
        pepperoni();
    }

    window.Pizza = Pizza;
}());
Run Code Online (Sandbox Code Playgroud)

关于重新创建函数与一次定义函数。首先,如果您想使用内部私有成员并且仍然使用“ this”,只需创建一个新变量,self并将其分配this给它:

function Pizza() {
    var self = this;
    function pep() {
       self.x = 1;
    }
}
Run Code Online (Sandbox Code Playgroud)

接下来,我尝试测试重新定义和编写函数之间的性能差异:http : //jsperf.com/private-methods我认为,每次重新创建函数可以为您节省不到20%的操作/秒时间。

我不建议任何方法,它们在不同时间都是有效和有用的。有时更多地是关于语义,有时是关于性能,而有时是为了达到诸如单元测试之类的目的。