【发布时间】:2014-02-18 17:55:30
【问题描述】:
这是著名的 JavaScript 模块模式的一个例子:
var Person = (function() {
var _name; // so called 'private variable'
function Person(name) {
_name = name;
}
Person.prototype.kill = function() {
console.log(_name + ' has been shot');
};
return Person;
})();
var paul = new Person('Paul');
paul.kill();
到目前为止还不错吧?这会将'Paul has been shot' 记录到控制台,这正是我们想要的。
但是。
_name 真的是私有变量吗?我会将私有变量定义为属于对象实例的变量,外部世界无法访问该变量。最后一部分有效,我无法从闭包外部访问_name。
但如果我这样做:
var paul = new Person('Paul');
var bran = new Person('Bran');
paul.kill();
bran.kill();
这将记录'Bran has been shot',两次。那里没有保罗。所以_name 实际上与我的 Person 对象的所有实例共享。这就是我将其定义为“静态变量”的内容,尽管它也无法从外部访问。
那么有没有办法用模块模式创建一个真正的私有成员变量?一种不是静态的。
也经常发生的事情是在构造函数内部定义this._name,但这会杀死私有部分,现在可以从外部访问:
function Person(name) {
this._name = name;
}
var bran = new Person();
console.log(bran._name); // yep, accessible
问题:
所以。私有不是真正私有的,只是静态的。我们如何使用模块模式创建一个真正的私有成员变量?一个属于实例的变量,它不是静态的,一个不能从外部访问的变量。
【问题讨论】:
-
Private 有点贵,具体取决于您要创建的实例数量。为什么需要了解原型。stackoverflow.com/a/16063711/1641941 稍微便宜一点可能是实现受保护的模式。 stackoverflow.com/a/21800194/1641941
标签: javascript modularity