Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/420.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 隐私:带下划线的原型属性还是封装的变量?_Javascript_Instance Variables - Fatal编程技术网

Javascript 隐私:带下划线的原型属性还是封装的变量?

Javascript 隐私:带下划线的原型属性还是封装的变量?,javascript,instance-variables,Javascript,Instance Variables,有些事情一直困扰着我,就像人们意识到我不知道的事情一样。我正在看一个FOSS示例,简化如下。。。每当我有JavaScript类时,我更喜欢Crockford的变量隐藏方法: var MyObject = function(handler) { var x = 1, y = 2; function myFunction() { handler(x + y); } return { "myFunction" : myFunction } } 不过,有些开发人员使

有些事情一直困扰着我,就像人们意识到我不知道的事情一样。我正在看一个FOSS示例,简化如下。。。每当我有JavaScript类时,我更喜欢Crockford的变量隐藏方法:

var MyObject = function(handler) {
  var x = 1, y = 2;
  function myFunction() {
    handler(x + y);
  }
  return {
    "myFunction" : myFunction
  }
}
不过,有些开发人员使用带下划线的私有属性

var MyObject = function(handler) {
  this._handler = handler;
}
MyObject.prototype._x = 1;
MyObject.prototype._y = 2;
MyObject.prototype.myFunction = function() {
  this._handler(this._x + this._y);
}
我理解其中的区别,但冒着听起来愚蠢的风险:一个比另一个有优势,我没有看到吗?我的意思是,我不喜欢私人符号;他们不是私人的。我意识到原型链是在对象之间共享的,但它们是私有的。除了在运行时改变所有对象的x和y,或者节省内存,我不确定原因

我相信有一个很好的理由,但如果有人想进一步启发我,那就太棒了。

使用uu标记法的三个理由:

正如你提到的,性能。不会使用每个构造重新创建函数。 调试。在运行时很容易查看对象的所有属性。 结构很容易将部分代码分解成不同的文件,或者在子类中继承属性。闭包设置为私有的变量限制了您组织代码的方式。这有点像在OOP语言中使用受保护/友元变量而不是私有变量的参数。
在这两个方向上都有其他的争论,但它变得更加哲学化——关于是信任程序员编写代码还是执行良好的实践,但我不会去那里

如果你喜欢Crockford的作品,我建议你看看他的JavaScript系列,他在其中描述了为什么他避免使用下划线,而更喜欢使用符号


要直接回答您的问题,使用下划线没有性能优势,它只是一种编程风格的首选项。

您纯粹是从命名的角度来讨论下划线。OP讨论的是使用下划线表示的隐式私有变量与闭包强制的显式私有变量的设计模式。谢谢。我刚刚重构了这个FOSS对象以使用真正的私有变量/闭包,它的工作原理是一样的。出于好奇,我将进行一些性能测试。。。但从实用的角度来看,对我来说,代码现在更干净了,API也更干净了。。。更不用说被动性保险了。@Box9,你看过Crockford关于为什么下划线在JavaScript中毫无意义的解释吗?如果不是的话,我建议快一点看-让我澄清一下:我并不是直接问,更多的是为什么使用公开的私有变量的原型继承比封装更可取。。。但我认为这篇文章的大部分都回答了这个问题?@Lance,我从争论的双方都听到了很多,看到这些视频如此受欢迎,我怀疑这些争论是否已经受到Crockford的影响。尽管如此,我还是不介意看你说的那一点。你知道它的确切视频吗,因为有很多:毫无疑问,PI完全同意你的第二点。在我的例子中,第1点不起作用,你必须看到来源。我有点明白你在3上的观点。。。但是我必须看一个例子来确定跨文件分割原型继承是否真的有好处;我想你不会想。。。但是有一个例子可以证明我错了。@Clint,它可能对你的情况有效,但是任何不在MyObject函数中的函数都不能访问x和y。换句话说,如果MyObject函数变得更复杂,它将被迫成为一个巨大的函数。虽然在性能方面达成一致,但绝大多数应用程序都不太关心性能。你说得绝对正确。我将函数封装在同一个构造函数中,并通过返回一个包含已公开函数和变量的对象来公开API。@Clint,这是完全有效的。顺便说一句,它被称为模块模式,但缺点是不容易将myobject拆分为核心文件和附加文件,例如,将其扩展到mySpecialObject类也不容易。我不打算推广这两种模式,因为如果对象变得更复杂,最终您将需要同时使用这两种模式—用于临时工作变量的模块模式和用于有状态数据的公共属性,以及一个下划线,用于警告未记录对属性的使用。这是一个很好的扩展点。在这种情况下,扩展不是期望的特性。我不是一个创建许多可扩展甚至可构造对象的人;我大部分倾向于写单身汉。绝对让我深思,谢谢!