Javascript 用于标记私有成员的前导下划线

Javascript 用于标记私有成员的前导下划线,javascript,oop,coding-style,private,jslint,Javascript,Oop,Coding Style,Private,Jslint,正如我所知,在JavaScript中,没有好的解决方案来创建私有成员。描述的解决方案效率不高,因为私有成员成为对象的一部分,而不是原型,因此需要更多内存。 所以,我决定只使用Python实践——用前导下划线标记私有内容,让其他人知道makred属性或方法不打算从外部使用。 但是有一个著名的代码质量工具-,它建议不要使用前导下划线或尾随下划线。 这背后的理由是什么?这只是代码风格的建议还是下划线会导致更严重的问题?如果它只是JS社区中的代码风格惯例,那么它有多强大?它只是一个代码风格建议。 您可以

正如我所知,在JavaScript中,没有好的解决方案来创建私有成员。描述的解决方案效率不高,因为私有成员成为对象的一部分,而不是原型,因此需要更多内存。
所以,我决定只使用Python实践——用前导下划线标记私有内容,让其他人知道makred属性或方法不打算从外部使用。
但是有一个著名的代码质量工具-,它建议不要使用前导下划线或尾随下划线。

这背后的理由是什么?这只是代码风格的建议还是下划线会导致更严重的问题?如果它只是JS社区中的代码风格惯例,那么它有多强大?

它只是一个代码风格建议。 您可以改为使用,并按照项目/公司中的代码样式进行设置。
对我来说,如果你用这种方式标记私人成员,没有什么不好的。主要原则是在整个项目中遵循统一的惯例。如果这使您的代码更具可读性和可维护性,您可以自由地遵循当前项目的约定。

下划线前缀可以用作约定。但这只是一个惯例

如果私有成员是对象实例的属性,那么唯一的方法就是在构造函数中声明一个变量。对象的属性从未在prototype中注册。如果您在proto中存储一个属性,那么他的值将与所有其他实例共享。 它的工作原理就像《公安条例》中的静力学

原型仅用于解决实例中未定义的属性

例如:

function O(){}
O.prototype.name = "John";
var o = new O;

// o look like that :
// {
//   __proto__: { name: "John"}
// }
console.log(o.name); // write "John"

o.name = "Tom";
// now :
// {
//   name: "Tom",
//   __poto__: { name: "John" }
// }
console.log(o.name); // write "Tom"
实例上名称的定义不会覆盖原型值。它只存储在级联解析中proto值之前的实例中



对不起,我的英语不好。

JSLint是一个很好的工具,但它表达了作者对编码实践的看法。在JavaScript解析器中使用前导下划线/下划线并没有什么害处,该工具被编程为将其视为一种不好的约定,并警告您不要使用它。如果您喜欢使用前导下划线,并且有意义,请使用它们

如果您不想在使用以下划线/下划线开头的标识符时看到JSLint中的警告,那么JSLint中有一个设置可以对您隐藏这些警告。如本例所示,将不希望计算的代码包装起来,您将不会看到警告:

 /*jslint nomen: true */
 var _gaq = {};
 /*jslint nomen: false */
如果您正在从文件中评估代码,则这是正确的,但是如果您在JSLint网站上,则有一个选项“容忍…悬挂在标识符中”,该选项也会删除警告

请注意,这样做可能会导致JSHint解析文件的方式出现问题。请查看此链接,该链接显示了与该标志相关的内容。但是,如果要使用JSLint标准,混合JSHint可能会引起一些混乱


如果不使用闭包,JavaScript中不存在私有变量,但它不是每个项目执行都需要的模式。如果您想了解有关JavaScript中闭包的更多信息,请签出,并且

您不能关闭该检查吗?与++和--check相同?官方的ECMA3保留了下划线和美元,我想,但情况已经不是这样了。看起来Ben Nadel的链接出错了。这是回程机器链接: