更新:使用 ES6,有一个更好的方法:
长话短说,您可以使用 newSymbol
创建私有字段。
这是一个很好的描述:https : //curiosity-driven.org/private-properties-in-javascript
例子:
var Person = (function() {
// Only Person can access nameSymbol
var nameSymbol = Symbol('name');
function Person(name) {
this[nameSymbol] = name;
}
Person.prototype.getName = function() {
return this[nameSymbol];
};
return Person;
}());
对于所有带有 ES5 的现代浏览器:
你可以只使用闭包
构造对象的最简单方法是完全避免原型继承。只需在闭包中定义私有变量和公共函数,所有公共方法都可以私有访问这些变量。
或者你可以只使用原型
在 JavaScript 中,原型继承主要是一种优化。它允许多个实例共享原型方法,而不是每个实例都有自己的方法。
缺点是这this
是每次调用原型函数时唯一不同的地方。
因此,任何私有字段都必须可以通过 访问this
,这意味着它们将是公开的。所以我们只是坚持_private
字段的命名约定。
不要费心将闭包与原型混合
我认为您不应该将闭包变量与原型方法混合使用。您应该使用其中一种。
当您使用闭包访问私有变量时,原型方法无法访问该变量。因此,您必须将闭包公开到 上this
,这意味着您要以一种或另一种方式公开公开它。这种方法几乎没有什么好处。
我选择哪个?
对于非常简单的对象,只需使用带有闭包的普通对象即可。
如果您需要原型继承——为了继承、性能等——那么坚持“_private”命名约定,不要打扰闭包。
我不明白为什么 JS 开发人员如此努力地使字段真正私有。