Bra*_*eer 6 javascript modularity
所以这是着名的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();
Run Code Online (Sandbox Code Playgroud)
到目前为止这么好吧?这会记录'Paul has been shot'到控制台,这是我们想要的.
但.
是_name一个真正的私有变量?我将私有变量定义为属于对象实例的变量,外部世界无法访问该变量.最后一部分工作,我无法_name从封闭外部访问.
但如果我这样做:
var paul = new Person('Paul');
var bran = new Person('Bran');
paul.kill();
bran.kill();
Run Code Online (Sandbox Code Playgroud)
然后这将记录'Bran has been shot'两次.那里没有保罗.所以,_name实际上是与所有实例共享我的Person对象的.这就是我将其定义为"静态变量",尽管它也无法从外部访问.
那么有没有办法用模块模式创建一个真正的私有成员变量?一个不是静止的.
同样发生的事情是this._name在构造函数内部定义,但这会杀死私有部分,现在可以从外部访问:
function Person(name) {
this._name = name;
}
var bran = new Person();
console.log(bran._name); // yep, accessible
Run Code Online (Sandbox Code Playgroud)
题:
所以.私人不是私人的,只是静态的.我们如何使用模块模式创建一个真正的私有成员变量?属于实例的变量,它不是静态的,而是不能从外部访问的变量.
你是对的; _name更多的是一个静态变量.它保存在包含构造函数的闭包中,因此构造函数的每次使用都将使用相同的变量.请记住,这与类无关,而与闭包和函数有关.它可以非常方便,但不是你如何做私人会员.
不出所料,Douglas Crockford 在Javascript中有一个专门用于私人成员的页面.
为了成为私人成员,你必须"更深层次".不要在构造函数之外使用闭包; 使用构造函数作为闭包.构造函数内定义的任何变量或方法显然都不能被外界使用.实际上,对象也无法访问它们,因此它们非常"私密".
我们想要使用我们的私人会员.:) 那么该怎么办?
好吧,在构造函数中,执行以下操作:
var Klass = function () {
var private = 3;
this.privileged = function () { return private; };
};
Run Code Online (Sandbox Code Playgroud)
然后:
var k = Klass();
console.log(k.privileged()); // 3
Run Code Online (Sandbox Code Playgroud)
看看如何使用构造函数作为闭包?this.privileged生活在,附着在物体上,因此private生活在this.privileged封闭物内部.
不幸的是,Javascript中的私有和特权方法存在一个问题.它们必须每次都从头开始实例化.没有代码共享.这显然是私人会员想要的,但对于方法来说并不理想.使用它们会减慢对象实例化并使用更多内存.如果您遇到效率问题,请记住这一点.