Ark*_*nez 11 javascript oop methods styles
我正与一位开发人员讨论是否有意识地侵入javascript私有函数.
替代方案是:
_function_name以便开发人员知道他们可以调用什么以及他们不能调用什么.我们不考虑其他方法,比如在表单的构造函数中创建私有函数,var private_var= function(){}因为每次对象实例化时都会触发所有这些函数的创建,并且每个对象都有自己的集合.
我们为他们提供的理由:
1
this或者它们需要被调用function.call(object)或者function.apply(object)2
我们怀疑,因为很多开发人员使用它,可能还有其他原因,比如性能等,就像这样使用.
由于我们对Javascript的了解非常有限,我们决定在stackoverflow中发布这个,以了解哪种方法更好,为什么.
您将如何侵入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%的操作/秒时间。
我不建议任何方法,它们在不同时间都是有效和有用的。有时更多地是关于语义,有时是关于性能,而有时是为了达到诸如单元测试之类的目的。